androidlistviewandroid-viewholderconvertview

Explain individual role of convertView and View Holder Pattern in ListView


Can anyone explain the individual role of convertView and View Holder Pattern in ListView, and how they increased the efficiency of listview?

private class PersonsAdapter extends ArrayAdapter<Person> {

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

        ViewHolder holder;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_entry, null);
            holder = new ViewHolder();
            holder.nameTextView = (TextView) convertView.findViewById(R.id.person_name);
            holder.surnameTextView = (TextView) convertView.findViewById(R.id.person_surname);
            holder.personImageView = (ImageView) convertView.findViewById(R.id.person_image);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }

        Person person = getItem(position);

        holder.nameTextView.setText(person.getName());
        holder.surnameTextView.setText(person.getSurname());
        //holder.personImageView.setImageBitmap(person.getImage());

        return convertView;
    }
}

Solution

  • it's a view that was previously inflated (when convertView==null) and was on the screen, but now have been scrolled out of the screen, so you can re-use it to display data from the view that will enter the screen soon.

    improves performance by reducing view inflation (calls to inflater.inflate are expensive), reduces garbage collection, and reduces memory allocation.

    keeps a direct reference to your view.

    potentially improves performance because findViewById is a for-loop going around the view hierarchy that can potentially eat away quite precious time of the UI thread. This improvement might be small, but in a fast scrolling list, every nano-second counts to have a nice smoth 60fps.