java使用ViewHolder为ListView项设置onClickListener
我有一个InfoListAdapter
,它使用以下代码填充列表中的视图:
public InfoListAdapter(final Context context) {
super(context, 0);
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.info_list_item, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.populateViews(getItem(position));
return convertView;
}
}
我想知道我如何遵循这个ViewHolder
模式,仍然添加一个onClickListener
在单击时将启动另一个活动DetailListActivity
。我的策略是使用现有的populateViews
方法进行mListener
更改
不用说,这是行不通的。我认为这里的部分问题是,因为当我设置mListener
时onClickListener
是空的,所以即使我更改了mListener
的值,该引用也会保留。但是更深层次的问题是我如何设置这样的东西,在那里我可以使用ViewHolder
模式,让populateViews
进行装饰(在向单击操作添加侦听器方面)
class ViewHolder {
private TextView mTextViewDisplayName;
private OnClickListener mListener;
private Context mContext;
public ViewHolder(final View view) {
mTextViewDisplayName = (TextView) view.findViewById(R.id.tv_displayname);
view.setOnClickListener(mListener);
mContext = view.getContext();
}
public void populateViews(final Info infoItem) {
mTextViewDisplayName.setText(infoItem.displayName);
mListener = new OnClickListener() {
public void onClick(View view0) {
Intent mIntent = new Intent(mContext, DetailActivity.class);
mIntent.putExtra(EMService.INTENT_EXTRA_DETAIL_VIEW_SOMEPARAM, 0);
startActivityForResult(mIntent, 0);
}
};
}
}
# 1 楼答案
在包含ListView的父活动/片段中,您可以实现ListListener并在那里处理您的单击。这样,您就不必为实例化的每个视图分配单击处理程序
例如,假设您有一个名为MyListActivity的ListActivity类(我很有创意)