使用 ViewHolder 模式保存视图查找

特别是在 ListView 中,你可以通过在滚动期间执行太多 findViewById() 调用来遇到性能问题。通过使用 ViewHolder 模式,你可以保存这些查找并提高你的 ListView 性能。

如果你的列表项包含单个 TextView,请创建一个 ViewHolder 类来存储实例:

static class ViewHolder {
    TextView myTextView;
}

在创建列表项时,将 ViewHolder 对象附加到列表项:

public View getView(int position, View convertView, ViewGroup parent) {
    Item i = getItem(position);
    if(convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);

        // Create a new ViewHolder and save the TextView instance
        ViewHolder holder = new ViewHolder();
        holder.myTextView = (TextView)convertView.findViewById(R.id.my_text_view);
        convertView.setTag(holder);
    }

    // Retrieve the ViewHolder and use the TextView
    ViewHolder holder = (ViewHolder)convertView.getTag();
    holder.myTextView.setText(i.getText());
   
    return convertView;
}

使用这种模式,只有在创建新的 View 时才会调用 findViewById(),并且 ListView 可以更有效地回收你的视图。