2

我目前正在将此代码用于按钮的侦听器来执行某些操作:

 @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 更好?

4

1 回答 1

3

现在我想知道,这对内存管理有好处吗

它可以更好。因为列表被滚动并且这些项目被重复使用,你最终会创建很多OnClickListener对象并孤立其他对象。这不一定是内存泄漏,因为旧的会被收集,但这仍然不是一个好的选择。

还是在活动本身中做一个 onListItemClick 更好?

如果您因为列表中的某个项目只有一次单击操作而可以侥幸逃脱,那么您绝对应该坚持OnItemClickListener列表而不是自己处理。

但是,如果您需要将每个项目的特定部分创建为可点击或希望对给定项目执行多个操作,那么最好将这些操作收集到一个单独OnClickListener创建一次然后附加到中的每个项目getView()。您可以通过将有关单击操作的元数据以及列表位置附加到视图本身来区分单击了哪个项目setTag()。如果这个逻辑很复杂,最好为列表项创建一个自定义视图,让视图本身处理每一行的所有点击,而不是尝试在外部处理这些操作。

于 2012-12-02T19:33:55.440 回答