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