android - 带按钮内存的定制适配器

标签 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;
 } 

现在我想知道,这对内存管理有好处还是在 Activity 本身中执行 onListItemClick 更好?

最佳答案

Now I wonder , Is this good for memory management

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

or is it better to do a onListItemClick in the activity itself?

如果因为列表中的某个项目只有一次点击操作而可以逃脱惩罚,那么您绝对应该坚持使用 OnItemClickListener 来处理列表,而不是自己处理这个问题。

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

关于android - 带按钮内存的定制适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13672821/

相关文章:

MySQL 内存使用过多

java - 为什么这个java进程不释放内存?

java - 如何在 JavaFX 中设置按钮的坐标?

android - 带有参数化 IN (...) 子句的 Sqlite UPDATE

java - 测试 bundle 中是否存在某个值的更好方法?

android - 如何在电子商务应用程序中将 ListView 项目显示为项目?

windows - PE文件如何映射到内存中?

javascript - Jquery 确认不工作

java - 自动单击 JavaFX Webview 中的按钮

Android Studio 没有提供添加新 Activity 的选项