为什么不在 ListView 本身上使用 onItemClickListener?
您的适配器应该包含一个对象类型的列表(没有严格的规则,但它有助于更轻松地管理项目)。例如
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;
现在,您的视图将把它作为一个对象来处理,而不是一个具有多个值的布局。
然后我们将所有的点击动作移动到 ListView 所在的 Activity 中。
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 的方式。然后您将能够访问与该视图绑定的对象以及单击的位置。
如果您希望将味精和数据分开。您可以使用 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;
}
}
在 Activity 中,我处理项目点击动作
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);
希望这能回答你的问题:)