【问题标题】:Animating appearing items in ListView while using ViewHolders使用 ViewHolders 时在 ListView 中显示项目的动画
【发布时间】:2014-03-21 15:21:28
【问题描述】:

我在 Android ListFragment 中使用 ListView 并使用 ViewHolder 模式来提高滚动性能。我的 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 时仅对出现的视图进行动画处理?

提前致谢,麦克法兰

【问题讨论】:

标签: android listview animation


【解决方案1】:

知道了!

问题是我将动画作为静态字段保存在某处,以便在每次创建视图时都不会从资源中加载它:


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

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多