如何使 android listView 只重绘新插入的行
how to make android listView redrawing only newly inserted rows
- 我将 listView 与
BaseAdapter
一起使用
- 我最初在适配器中放入了 50 个项目
- 然后当列表向上滚动并到达第 2 行时,我再加载 50 个
- 我在添加更多项目时执行
adpater.notifyDatasetChanged()
。
- 那我就
listView.setSelection(50)
但是,我的问题是 android 正在为所有 100 行重新创建视图。
但我只想从 0 - 50
中抽取 new 50 行
如果我有 1000 行,UI 会很慢。
是否可以绘制部分行?
您应该在适配器中实现视图持有者模式。这是我的一个实现此模式的应用程序中的 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 class 很简单,只包含对视图的引用:
private static class ViewHolder {
ImageView imageViewFeeling;
TextView textViewFeeling;
}
想法是 inflate
和 findViewById
方法很重,如果您已经有一个 View
就没有必要重新创建它。
您也可以考虑将 ListView
替换为 RecyclerView
,这会强制使用视图持有者模式。
- 我将 listView 与
BaseAdapter
一起使用
- 我最初在适配器中放入了 50 个项目
- 然后当列表向上滚动并到达第 2 行时,我再加载 50 个
- 我在添加更多项目时执行
adpater.notifyDatasetChanged()
。 - 那我就
listView.setSelection(50)
但是,我的问题是 android 正在为所有 100 行重新创建视图。
但我只想从 0 - 50
中抽取 new 50 行如果我有 1000 行,UI 会很慢。
是否可以绘制部分行?
您应该在适配器中实现视图持有者模式。这是我的一个实现此模式的应用程序中的 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 class 很简单,只包含对视图的引用:
private static class ViewHolder {
ImageView imageViewFeeling;
TextView textViewFeeling;
}
想法是 inflate
和 findViewById
方法很重,如果您已经有一个 View
就没有必要重新创建它。
您也可以考虑将 ListView
替换为 RecyclerView
,这会强制使用视图持有者模式。