在ListView中为新添加的项目添加动画效果

14

如何在 ListView 中为新添加的项目添加动画效果?

我有一个 adapter,当我向列表中添加新项目时,我会调用adapter.notifyDataSetChanged();,项目被添加了,一切都运行得很完美,但我的问题是我希望新添加的元素有一些动画效果。


我有一种感觉,这不是一项容易的任务。你计划在你的“ListView”中有多少个项目? - inazaruk
我希望每次添加新项时都播放动画。有些东西会随机更改我的数据,然后调用adapter.notifyDataSetChanged()每秒钟一次,因此如果有新数据,则会在listview上呈现,这完美地解决了问题,但问题是没有动画... - Lukap
我问关于项目数量的原因是,如果您要将新项目添加到LinearLayout中,则会有更多的机会进行动画处理。但是,仅当视图数量相对较少时才可行。如果您计划在列表中拥有50个或更多项目,则LinearLayout变得过于昂贵。 - inazaruk
拥有动画效果的LinearLayout很不错,如果可能的话,我是指将LinearLayout作为ListView中的项。你知道我该怎么做吗? - Lukap
不,我的意思是使用LinearLayout而不是 ListView - inazaruk
3个回答

25

Animate每个添加到您的Custom Adapter的元素,在getView()方法中。

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方法呢?我也需要重写它吗? - Lukap
是的,我已经尝试过这个方法并且它对我有效。我认为你不需要重写bindView方法。 - ASH
我的问题是,如果我不重写bindView方法,列表会非常缓慢和卡顿,所以我必须找到正确的重写方式,确保动画只播放一次。因为如果我在两个方法中都重写,有时动画会播放两次。 - Lukap
4
在代码行 "if(flag == false)" 中,"flag" 变量是什么? - Nitesh Kumar
@NiteshKhatri 它用于避免在当前正在显示的单元格上进行动画处理。 - anonymous

7

这个例子不是普通的列表视图,而是滚动视图。 - Frank Nguyen

5
添加此类动画比我最初想象的要困难。根据您尝试实现的动画类型,有两种方法可供选择。

这是一种相当复杂的方法,但我找到的唯一一种向ListView的子项添加动画的方法如下:

您可以尝试通知适配器您希望删除的项目的ID,并调用adapter.notifyDataSetChanged();。这将生成对适配器的getView()方法的调用。在其中,您可以执行以下操作:

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

动画结束后,您可以调用adapter.notifyDataSetChanged()来将所有内容放置在正确的位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接