0
我有一个使用下面的代码来填充视图列表中的InfoListAdapter
设置onClickListener的ListView项:使用ViewHolder
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);
}
};
}
}
以及如何绑定该侦听onItemClick我Activity的ListView的? – 2012-04-12 18:19:55
为了清楚起见,我尝试了'this.getListView()。setOnItemClickListener(this)',但这是否是理想的方式?为什么当我实现接口'OnItemClickListener'时,甚至必须绑定它?它不应该自动这么做吗? – 2012-04-12 18:22:05
@Luksprog我绝对没有'延长ListActivity'和'实施OnItemClickListener',并添加了覆盖'(无效)onItemClick',但似乎只当我将它绑定使用'this.getListView()工作。setOnItemClickListener(这)' 。如果我没有该行,则点击项目时不会发生任何事情。 – 2012-04-12 19:42:35