我正在使用Custom ListViewAdapter来显示列表。
列表中的每一行都有3个按钮,即附加了侦听器。
但是我感到非常不安的是,在每次滚动过程中,即使对于存在convertView的那些行,都将创建新的OnClickListeners作为非null值。

//据我了解,最常见的视图转换方法是:

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上的经验,Spider-sense的“叮叮当当”-似乎创建并丢弃相同的侦听器方法会导致垃圾收集器滥用。
我不确定何时收集了旧的听众,是否……

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

最佳答案

您可以将列表适配器类设置为从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
}

10-05 20:48
查看更多