自定义适配器带按钮内存

时间:2012-12-02 19:21:46

标签: android memory button adapter

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

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

1 个答案:

答案 0 :(得分:3)

  

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

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

  

或者在活动本身中做一个onListItemClick是否更好?

如果您因为列表中的项目只有一次点击操作就可以侥幸成功,那么您应该坚持OnItemClickListener列表,而不是自己处理。

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