ListViewAdapter - 何时收集附加到视图的侦听器?

时间:2013-04-26 18:44:55

标签: android performance android-listview garbage-collection

我正在使用Custom ListViewAdapter来显示列表。 列表中的每一行都有3个按钮,即附加的监听器。 但我发现它非常令人不安,在每次滚动期间,即使对于存在convertView的那些行,也会创建新的OnClickListener,作为非空值。

//转换视图最常用的方法,据我所知:

public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;   
    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.listview_item, parent, false);
    } else {
        view = convertView;
    }
    final TextView textView = (TextView) view.findViewById(R.id.txtProduct);
    textView.setText(name);
    textView.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            ...
        }
});
... two more listeners, with the same approach
return view;

根据我对Java的经验,蜘蛛感觉“ting-a-lings” - 似乎创建和丢弃相同的侦听器方法是垃圾收集器滥用。 我不确定这位老听众何时被收集,如果它已经......

有没有办法使用旧的侦听器,而不是创建一个新的侦听器? (某种缓存数据结构)

1 个答案:

答案 0 :(得分:1)

您可以将List Adapter类设置为从View.OnClickListener接口继承。然后,只需设置

textView.setOnClickListener(this);

并处理适配器类“onClick方法中的单击”。例如,要知道单击了哪一行,请在上一行之前添加此行:

textView.setTag(position);

然后,在onClick中,您可以通过获取此标记来了解您正在处理的列表中的哪个位置:

public void onClick(View v) {
    Object item = myList.get((Integer) v.getTag());
    //handle click event
}