【问题标题】:Animate newly added items in ListView在 ListView 中为新添加的项目设置动画
【发布时间】:2011-06-07 11:54:57
【问题描述】:

如何为ListView 中新添加的项目设置动画?

我有一个adapter,当我在列表中添加新项目时,我说adapter.notifyDataSetChanged(); 项目已添加,一切正常,但我的问题是我希望新添加的元素有一些动画。

【问题讨论】:

  • 我感觉这不是一件容易的事。您打算在ListView 中包含多少项目?
  • 嗯,我希望每次添加新项目时都播放动画。有些东西会随机更改我的数据和 adapter.notifyDataSetChanged();我每秒都打电话,所以如果有新数据而不是在完美工作的列表视图上显示,但问题是没有动画。 . .
  • 我之所以问项目数量,是因为您将有更多机会为您添加到LinearLayout 制作动画。但这仅在您的视图数量相当有限的情况下才可行。如果您打算在列表中包含 50 多个项目,那么 LinearLayout 将变得非常昂贵。
  • 如果可能的话,动画线性布局很好,我的意思是列表视图内的线性布局作为项目。你知道我该怎么做吗?
  • 不,我的意思是LinearLayout 而不是 ListView

标签: android listview animation adapter


【解决方案1】:

AnimateCustom AdaptergetView() 方法中添加的每个元素。

public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;

    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getActivity()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.simple_list_item_1, null);
    }

    ListData o = list.get(position);
    TextView tt = (TextView) v.findViewById(R.id.toptext);

    tt.setText(o.content);

    Log.d("ListTest", "Position : "+position);
    if(flag == false) {
        Animation animation = AnimationUtils
                .loadAnimation(getActivity(), R.anim.slide_top_to_bottom);
        v.startAnimation(animation);
    }
    return v;
}

从而实现Animation

【讨论】:

  • 你试过这个吗?我也应该重写那个方法吗?
  • 是的,我已经尝试过了,它对我有用。我认为你不需要重写 bindView 方法。
  • 好吧,我的问题是,如果我不覆盖 bindView 方法,列表会非常缓慢且缓慢,因此我必须找到正确覆盖的方法,并且让动画完全播放。因为如果我在这两种方法中都覆盖,动画有时会播放两次
  • @ASH "if(flag == false)" 行中的标志变量是什么?
  • @NiteshKhatri 它用于避免对当前正在显示的单元格进行动画处理
【解决方案2】:

Android 中有关动画的官方文档说,您可以使用 android:animateLayoutChanges="true" 设置动画以在布局更改时触发。

取自:http://developer.android.com/training/animation/layout.html

【讨论】:

  • 这个例子不是普通的列表视图,它是滚动视图。
【解决方案3】:

添加这种动画比我最初想象的要难。根据您要实现的动画类型,有两种方法。

这是一个相当的技巧,但我发现向ListView 的孩子添加动画的唯一方法是:

您可以尝试将您愿意删除的项目的 id 通知适配器并调用adapter.notifyDataSetChanged();。这将生成对适配器的getView() 方法的调用。在里面你可以做类似的事情:

if ( item.getId() == itemToRemove ) {
 //apply the animation
}

动画完成后,您可以调用adapter.notifyDataSetChanged() 将所有内容放置到位。

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 2023-04-08
    • 2015-12-14
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    相关资源
    最近更新 更多