如何让android listView只重绘新插入的行

时间:2016-01-08 23:49:26

标签: android android-listview

  • 我将listView与BaseAdapter
  • 一起使用
  • 我最初在适配器中放了50个项目
  • 然后当列表向上滚动并到达第2行时,我再加载50个
  • 当我添加更多项目时,我会执行adpater.notifyDatasetChanged()
  • 然后我listView.setSelection(50)

但是,我的问题是android正在为所有100行重新创建视图。

但我只想从0 - 50

中抽取 50行

如果我有1000行,UI将非常慢。

是否可以绘制部分行?

1 个答案:

答案 0 :(得分:0)

您应该在适配器中实现视图持有者模式。以下是我的一个实现此模式的应用程序的Adapter.getView方法示例:

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

    if (convertView == null) {
        final LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.list_item_feeling, parent, false);

        viewHolder = new ViewHolder();
        viewHolder.imageViewFeeling = (ImageView) convertView.findViewById(R.id.imageview_feeling);
        viewHolder.textViewFeeling = (TextView) convertView.findViewById(R.id.textview_feeling);

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    final Feeling feeling = getItem(position);

    viewHolder.imageViewFeeling.setImageResource(feeling.getDrawable());
    viewHolder.textViewFeeling.setText(feeling.getLabel());

    return convertView;
}

ViewHolder类很简单,只保存对视图的引用:

private static class ViewHolder {
    ImageView imageViewFeeling;
    TextView textViewFeeling;
}

我们的想法是,inflatefindViewById方法很重,如果您已经有View,则无需重新创建它。

您也可以考虑将ListView替换为强制视图持有者模式的RecyclerView