ListView自体でonItemClickListenerを使用してみませんか?
アダプタには、1つのオブジェクトタイプのリストが含まれている必要があります(厳密な規則はありませんが、アイテムの管理がはるかに簡単になります)。例えば
class MsgObject{
String msg;
String data
//TODO Getters/Setters goes here
}
その場合、CustomAdapterには
List<MsgObject> objectList;
次に、getViewは次のようになります
MsgObject m = (MsgObject)getObject(position);
TextView text=(TextView)vi.findViewById(R.id.text);
ImageView image=(ImageView)vi.findViewById(R.id.image);
text.setText(m.getMsg());
text.getLineCount();
imageLoader.DisplayImage(m.getData(), image);
//Tag id is predefined in xml
vi.setTag(R.id.listItemTag, m);
return vi;
これで、ビューはこれを複数の値を持つ1つのレイアウトではなく、1つのオブジェクトとして処理します。
次に、すべてのクリックアクションをListViewが存在するアクティビティに移動します。
listView.setOnItemClickListener(){
new AdapterView.OnItemClickListener(){
@override
public onItemClick(AdapterView<?> parent, View view, int position, long id){
MsgObject m = (MsgObject)view.getTag(R.id.listItemTag);
Toast.makeText(context, "Pos[" + position
+ "] clicked, with msg: " + m.getMessage(), Toast.LENGTH_SHORT).show();
}
}
};
これは、遅延読み込みImageViewを使用したListViewの方法でもあります。次に、そのビューに関連付けられているオブジェクトと、クリックされた位置にアクセスできるようになります。
msgとdataを分離したい場合。setTag(id、obj);を使用できます。両方のオブジェクトなど。
setTag(R.id.listItemMsg, msg[position]);
setTag(R.id.listItemData, data[position]);
更新:私のCustomAdapterの例
/**
* Adapter for displaying Place selection list.
* @author Poohdish Rattanavijai
*
*/
public class PlaceAdapter extends BaseAdapter {
private static final String TAG = PlaceAdapter.class.getSimpleName();
private List<PlaceVO> list; // <-- list of PlaceVOs
private Context context;
private int viewResourceId;
/**
*
* @param context Context
* @param viewResourceId Layout ID for each item
* @param list resource list to populate
*/
public PlaceAdapter(Context context, int viewResourceId, List<PlaceVO> list){
this.context = context;
this.viewResourceId = viewResourceId;
this.list = list;
}
/**
* Number of result in the list plus one (for +add at the last item)
*/
@Override
public int getCount() {
if(null != list){
return list.size();
}
return 1;
}
@Override
public Object getItem(int arg0) {
if(null != list){
try {
return list.get(arg0);
} catch (IndexOutOfBoundsException e) {
return null;
}
}
return null;
}
@Override
public long getItemId(int position) {
// if(null != list){
// try {
// return list.get(position).getId();
// } catch (IndexOutOfBoundsException e) {
// return 0;
// }
// }
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(null == convertView){
/**
* View does not exist, populate.
*/
LayoutInflater inflater = LayoutInflater.from(this.context);
convertView = inflater.inflate(this.viewResourceId, parent, false);
}
ViewHolder holder = (ViewHolder)convertView.getTag(R.id.adpter_view);
if(null == holder){
Log.d(TAG, "holder not found, init.");
/**
* ViewHolder does not exists for this view; create and assign respective view.
*/
holder = new ViewHolder();
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.details = (TextView) convertView.findViewById(R.id.details);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
holder.progress = (ProgressBar) convertView.findViewById(R.id.progress);
}
PlaceVO v = (PlaceVO)getItem(position); // <-- GetItem
if(null != v){
Log.d(TAG, "Place not null");
if(HelperUtil.IsNotNullOrEmpty(v.getName())){
Log.d(TAG, "Name: " + v.getName());
holder.title.setText(v.getName());
}
if(HelperUtil.IsNotNullOrEmpty(v.getVicinity())){
Log.d(TAG, "details: " + v.getVicinity());
holder.details.setText(v.getVicinity());
}
if(HelperUtil.IsNotNullOrEmpty(v.getIcon())){
holder.progress.setVisibility(View.VISIBLE);
holder.icon.setVisibility(View.GONE);
//TODO Initialize LazyLoad
}else{
holder.progress.setVisibility(View.VISIBLE);
holder.icon.setVisibility(View.GONE);
}
}
// Two tags, one for holder, another for the VO
convertView.setTag(R.id.adpter_view, holder);
convertView.setTag(R.id.adpter_object, v);
return convertView;
}
static class ViewHolder{
TextView title;
TextView details;
ImageView icon;
ProgressBar progress;
}
}
アクティビティ内では、アイテムのクリックアクションを次のように処理します
OnItemClickListener itemClick = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
PlaceVO v = (PlaceVO)arg1.getTag(R.id.adpter_object); // <-- get object using tag.
switchToPlaceScreen(v);
}
};
listView.setOnItemClickListener(itemClick);
これがあなたの質問に答えることを願っています:)