Search code examples
androidandroid-arrayadapterrecycle

Recycling views in custom array adapter: how exactly is it handled?


I am having an unclear issue concerning the recycling of views in a getView method of a custom array adapter.

I understand that elements are reused, but how do I know exact what to implement in the first part of the if statement, and what in the second?

Right now I am having following code. I came to this question due to dropping the code in the second part of the statement which results in a list of the first 9 elements, which are repeated numberous times instead of all elements. I didn't really know what is causing this exactly...

@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;
    } 

Solution

  • I understand that elements are reused, but how do I know exact what to implement in the first part of the if statement, and what in the second?

    The organization is quite simple once you get the hang of it:

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

    For detailed explanations of how ListView's RecycleBin works and why ViewHolders are important watch Turbo Charge your UI, a Google I/O presentation by Android's lead ListView programmers.