0 votes
in Android by
What is the ViewHolder pattern? Why should we use it?

1 Answer

0 votes
by

Every time when the adapter calls getView() method, the findViewById() method is also called. This is a very intensive work for the mobile CPU and so affects the performance of the application and the battery consumption increases. ViewHolder is a design pattern which can be applied as a way around repeated use of findViewById().

A ViewHolder holds the reference to the id of the view resource and calls to the resource will not be required after you "find" them: Thus performance of the application increases.

private static class ViewHolder {

  final TextView text;

  final TextView timestamp;

  final ImageView icon;

  final ProgressBar progress;

  ViewHolder(TextView text, TextView timestamp, ImageView icon, ProgressBar progress) {

    this.text = text;

    this.timestamp = timestamp;

    this.icon = icon;

    this.progress = progress;

  }

}

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

  View view = convertView;

  if (view == null) {

    view = // inflate new view

    ViewHolder holder = createViewHolderFrom(view);

    view.setTag(holder);  

  }

  ViewHolder holder = view.getTag();

  // TODO: set correct data for this list item

  // holder.icon.setImageDrawable(...)

  // holder.text.setText(...)

  // holder.timestamp.setText(...)

  // holder.progress.setProgress(...)

  return view;

}

private ViewHolder createViewHolderFrom(View view) {

    ImageView icon = (ImageView) view.findViewById(R.id.listitem_image);

    TextView text = (TextView) view.findViewById(R.id.listitem_text);

    TextView timestamp = (TextView) view.findViewById(R.id.listitem_timestamp);

    ProgressBar progress = (ProgressBar) view.findViewById(R.id.progress_spinner);

    return new ViewHolder(text, timestamp, icon, progress);

}

View.setTag(Object) allows you to tell the View to hold an arbitrary object. If we use it to hold an instance of our ViewHolder after we do our findViewById(int) calls, then we can use View.getTag() on recycled views to avoid having to make the calls again and again.

Related questions

0 votes
0 votes
asked Aug 31, 2023 in Android by Robindeniel
0 votes
asked Aug 31, 2023 in Android by Robindeniel
0 votes
asked Mar 29, 2023 in Android by Robin
...