自定义数组适配器中的回收视图:它是如何处理的?

Mat*_*anb 9 android recycle android-arrayadapter

我有一个关于在自定义数组适配器的getView方法中回收视图的问题不明确.

我理解元素是可以重用的,但是我怎么知道在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;
    } 
Run Code Online (Sandbox Code Playgroud)

fed*_*aol 15

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

在此输入图像描述

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

这篇文章是很好的起点


Sam*_*Sam 13

我理解元素是可以重用的,但是我怎么知道在if语句的第一部分中要实现什么,以及在第二部分中实现什么?

一旦掌握了它,该组织就非常简单:

public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        /* This is where you initialize new rows, by:
         *  - Inflating the layout,
         *  - Instantiating the ViewHolder,
         *  - And defining any characteristics that are consistent for every row */
    } else {
        /* Fetch data already in the row layout, 
         *    primarily you only use this to get a copy of the ViewHolder */
    }

    /* Set the data that changes in each row, like `title` and `size`
     *    This is where you give rows there unique values. */

    return convertView;
}
Run Code Online (Sandbox Code Playgroud)

有关ListView的RecycleBin如何工作的详细解释以及为什么ViewHolders非常重要,请观看Turbo为您的用户界面充电,这是Android的主要ListView程序员的Google I/O演示.


cod*_*gic 5

你想ViewHolder在你的班里创建一个班级MainActivity.就像是

 static class ViewHolder
    {
        TextView tv1;
        TextView tv2;
    }
Run Code Online (Sandbox Code Playgroud)

然后在你getView的第一次Views从你的xml中获取你的xml if并在之后重用它们else

View rowView = convertView;
        if (rowView == null)
        {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.layout_name_to_inflate, parent, false);
            holder = new ViewHolder();
            holder.tv1= (TextView) rowView.findViewById(R.id.textView1);
            holder.tv2 = (RadioGroup) rowView.findViewById(R.id.textView2);             
            rowView.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) rowView.getTag();
        }
Run Code Online (Sandbox Code Playgroud)