使用ViewHolders时动画显示ListView中的项目

时间:2014-03-21 15:21:28

标签: android listview animation

我在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时为显示的视图设置动画?

先谢谢麦克法兰

1 个答案:

答案 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;
}