我在Android ListFragment中使用ListView,并使用ViewHolder Pattern来提高滚动性能。我的ListAdapter的关键部分如下所示:
public View getView(int position, View convertView, ViewGroup parentGroup) {
View resultView;
Data data = dataList.get(position);
if (convertView == null) {
resultView = inflateView(parentGroup);
ViewHolder viewHolder = getViewHolder(position, resultView);
resultView.setTag(viewHolder);
viewHolder.fillView(data);
} else {
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.fillView(data);
resultView = convertView;
}
resultView.startAnimation(fadeInAnimation);
return resultView;
}
问题是由动画引起的:如果我慢慢地滚动非常,新视图会按原样淡入。但是一旦我滚动得更快,动画就会重新启动之前出现的几个项目。
例如,想象一下这些10个中有20个项目的列表是可见的。如果我向下滚动5个项目,则每次出现这些新项目时,项目11,12,13,14和15都会生成动画。 (所以11动画5次,第12项4次等)。
我认为这是因为convertView用于所有这些项目,所以动画确实从所有这些项目开始。
是否有可能仅在使用ViewHolders时为显示的视图设置动画?
先谢谢麦克法兰
答案 0 :(得分:2)
知道了!
问题在于我每次创建视图时都将动画保留为某个静态字段,以便不从资源加载它:
class ViewHolder {
static Animation anim;
ViewHolder(Context context) {
if (anim == null)
anim = AnimationUtils.loadAnimation(context, R.anim.anim);
}
}
//.....
public View getView(int position, View convertView, ViewGroup parentGroup) {
View resultView;
// [...]
resultView.startAnimation(anim);
return resultView;
}
查看Android View source code我发现当你调用startAnimation
并从第一个动画帧开始时,动画被设置为视图中的一个字段。
因此,每次创建新视图时,都会在之前设置的每个视图上启动相同的动画。我已修复它直接在getView
方法中加载动画:
public View getView(int position, View convertView, ViewGroup parentGroup) {
View resultView;
// [...]
resultView.startAnimation(AnimationUtils.loadAnimation(context, R.anim.anim));
return resultView;
}