android - 在自定义数组适配器 : how exactly is it handled? 中回收 View

标签 android android-arrayadapter recycle

关于在自定义数组适配器的 getView 方法中回收 View ,我有一个不清楚的问题。

我知道元素会被重用,但我如何确切知道在 if 语句的第一部分要实现什么,在第二部分要实现什么?

现在我有以下代码。我之所以想到这个问题,是因为在语句的第二部分删除了代码,这导致了前 9 个元素的列表,这些元素被重复了无数次而不是所有元素。我真的不知道是什么原因造成的...

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            title = getItem(position).getTitle();
            size = calculateFileSize(position);

            txtTitle = (TextView) row.findViewById(R.id.txtTitle);
            tvFileSize = (TextView) row.findViewById(R.id.tvFileSize);

            txtTitle.setText(title);
            tvFileSize.setText(size);

        } else {

            title = getItem(position).getTitle();
            size = calculateFileSize(position);

            txtTitle = (TextView) row.findViewById(R.id.txtTitle);
            tvFileSize = (TextView) row.findViewById(R.id.tvFileSize);

            txtTitle.setText(title);
            tvFileSize.setText(size);
        }

        return row;
    } 

最佳答案

这很容易。第一次没有创建行,所以你必须膨胀它们。之后,Android 操作系统可能会决定回收您已经膨胀且不再可见的 View 。这些已经膨胀并传递到 convertView 参数中,因此您所要做的就是安排它显示新的当前项目,例如将正确的值放入各种文本字段中。

enter image description here

简而言之,在第一部分中,您应该执行膨胀并填充值,在第二部分中,如果 (if convertView != null) 您应该只覆盖该字段,因为给定 View 具有已被回收,textviews 包含旧项目的值。

This postthis是很好的起点

关于android - 在自定义数组适配器 : how exactly is it handled? 中回收 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15912999/

相关文章:

android - 通过通知按钮打开蓝牙

android - 如果我们不需要位图,是否必须显式回收它?

android - ListActivity 和 Activity 的奇怪行为

android - 如何在Kotlin/Android中执行简单的HTTP请求?

java - 安卓工作室 : Espresso dependencies in gradle

java - 我可以在没有 fragment 的情况下执行条件导航吗?

java - 通过 ItemListener 更改 ListView

java - 按下主页按钮后如何在android中隐藏键盘

java - ListView 只显示第一项

iis-7 - 如何检查应用程序池上次回收