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

android, android-arrayadapter, recycle

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.

Problem

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

Original source

Related problems