我目前正在使用此代码为我的按钮的侦听器执行某些操作:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_row, null);
}
Person p = persons.get(position);
if (p != null) {
Button but = (Button) v.findViewById(R.id.buttonId);
but.setText(p.getDescription());
but.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// do stuff
}
});
}
return v;
}
现在我想知道,这对内存管理有用还是在活动本身中更好地进行onListItemClick?
答案 0 :(得分:3)
现在我想知道,这对内存管理有用吗
可能会更好。因为列表会滚动并重新使用这些项目,所以最终会创建大量OnClickListener
个对象并孤立其他对象。这不是一个内存泄漏,因为旧的将被收集,但它仍然不是一个很好的选择。
或者在活动本身中做一个onListItemClick是否更好?
如果您因为列表中的项目只有一次点击操作就可以侥幸成功,那么您应该坚持OnItemClickListener
列表,而不是自己处理。
但是,如果您需要创建每个项目的特定部分是可点击的,或者希望为给定项目执行多个操作,则最好尽可能将这些操作收集到单个OnClickListener
中创建一次,然后附加到getView()
中的每个项目。您可以通过附加有关点击操作的元数据来区分单击的项目,也可以使用setTag()
将位置列表到视图本身。如果这个逻辑很复杂,最好为列表项创建一个自定义视图,让视图本身处理每行的所有点击,而不是试图在外部处理这些操作。