Android 保持架模式和转换视图
我在前面学到了提高性能的好方法-保持器模式。这是加速UI和动画的好主意。Android 保持架模式和转换视图,android,performance,android-fragments,android-listview,android-view,Android,Performance,Android Fragments,Android Listview,Android View,我在前面学到了提高性能的好方法-保持器模式。这是加速UI和动画的好主意。 它清楚地说明了使用它的原因和方法。 我经常使用它,但现在对此我有点困惑。 当调用getView方法时,它有三个参数,一个是converView。正如我所理解的,它是列表项之前膨胀的视图,所以这里有一些关于这个的问题 若它是以前膨胀的视图,为什么不直接使用它,从方法返回它,当然在之前检查为null listview类是如何实现的,它具有私有数组或另一个保存所有膨胀视图的数据结构 为什么适配器中没有实现此功能 提前谢谢 @Ov
它清楚地说明了使用它的原因和方法。
我经常使用它,但现在对此我有点困惑。
当调用getView方法时,它有三个参数,一个是converView。正如我所理解的,它是列表项之前膨胀的视图,所以这里有一些关于这个的问题
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder =(ViewHolder) convertView.getTag();
}
不能调用
ViewHolder=(ViewHolder)convertView.getTag()代码>在getView
的第一行。因为convertView
可以是null
。请像这样重试:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHoldler holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(ctx).inflate(
R.layout.frag_home_gridview_item, null, false);
holder = new ViewHoldler();
holder.iv = (ImageView) convertView
.findViewById(R.id.gridview_item_label);
holder.tv = (TextView) convertView
.findViewById(R.id.gridview_item_name);
convertView.setTag(holder);
} else {
holder = (ViewHoldler) convertView.getTag();
}
holder.tv.setText(getItem(position));
holder.iv.setImageResource(this.ids[position]);
return convertView;
}
private class ViewHoldler {
ImageView iv;
TextView tv;
}
因为您很可能没有使用相同的视图。假设您有一行,其中包含文本视图。convertview是回收视图之一,它的textview可能会显示不同的信息
它保留了尽可能多的视图,一旦你向下滚动俯视图,它就会被回收,然后你回到答案1
我不明白,你的代码来自BaseAdapter类
如果只使用convertView
,则需要使用findViewById()
获取视图。这正是ViewHolder模式试图避免的findViewById()
是一种非常昂贵的方法,它会降低应用程序的速度,特别是当你在列表中滚动时不断调用它时
ListView重用子项的布局,以避免反复膨胀相同的视图
在人们提出ViewHolder模式之前,开发人员已经可以使用大多数适配器。最新的新列表视图,RecyclerView
,有一个适配器,强制使用ViewHolder模式