2012-04-12 66 views
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); 
      } 
     }; 
    } 
} 

回答

1

在你的父母活动/片段,它包含你的ListView你可以实现OnItemClickListener并处理你的点击。这样你就不必为每个你实例化的视图分配一个点击处理器。

Ex。比方说你有一个名为MyListActivity ListActivity类(我太有创意了)

public class MyListActivity extends ListActivity implements OnItemClickListener 
{ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
    { 
     Intent intent = new Intent(this, DetailActivity.class); 
     intent.putExtra(EMService.INTENT_EXTRA_DETAIL_VIEW_SOMEPARAM, 0); 
     startActivityForResult(intent, 0); 
    } 

} 
+0

以及如何绑定该侦听onItemClick我Activity的ListView的? – 2012-04-12 18:19:55

+0

为了清楚起见,我尝试了'this.getListView()。setOnItemClickListener(this)',但这是否是理想的方式?为什么当我实现接口'OnItemClickListener'时,甚至必须绑定它?它不应该自动这么做吗? – 2012-04-12 18:22:05

+0

@Luksprog我绝对没有'延长ListActivity'和'实施OnItemClickListener',并添加了覆盖'(无效)onItemClick',但似乎只当我将它绑定使用'this.getListView()工作。setOnItemClickListener(这)' 。如果我没有该行,则点击项目时不会发生任何事情。 – 2012-04-12 19:42:35