单击按钮后在 recyclerview 中动画单个视图

Animate single view in recyclerview after button click

我有一个按钮和一个回收站视图。该按钮刷新列表。我想在更新时为回收站视图中的其中一个文本视图设置动画。不是整个 recyclerview,不是整行 - 只有一个视图(每一行)。

我尝试将动画放在 onBindViewHolder 中。但这会在滚动时启动动画,当我添加列表条目时:

@Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
Animation animation = AnimationUtils.loadAnimation(context, R.anim.rv_animation_clockwise);
                ((ViewHolderItem)holder).tv.startAnimation(animation);

然后我尝试将 TextChangedListener 添加到我的文本视图中。但这与直接放入 onBindViewHolder 具有相同的效果:

((ViewHolderItem)holder).tv.addTextChangedListener(new TextWatcher() {
@Override
            public void afterTextChanged(Editable s) {

我最后一次尝试是使用 findViewHolderForAdapterPosition。但它什么也没做。 这是我的按钮调用的刷新方法。它在 RecyclerViewAdapter 中。 recyclerview 是我在 onAttachedToRecyclerView:

中设置的一个实例变量
RecyclerView recyclerView;

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        this.recyclerView = recyclerView;
    }

    void refresh (List<Entry> al){
            this.al = al;
            notifyDataSetChanged();

    ((ViewHolderItem)recyclerView.findViewHolderForAdapterPosition(0)).tv.startAnimation(animation);

颠簸

您应该实现自己的 ItemAnimator 并将其设置为您的 RecyclerView。这里有一些有用的信息:https://hackmd.io/@nesquena/r1IEQ-jAl?type=view

谢谢,我稍后会查看 ItemAnimator。 我昨天最后做的是在我的 adapter.refresh() 和动画之间添加一个小的延迟。就像他们建议的那样 。奇怪的是,这种延迟似乎是必要的,即使 notifyDataSetChanged();在动画之后被调用。我不认为这是一个很好的解决方案,但它现在有效。

                final Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rv_animation_clockwise);
                recyclerView.postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        for (int i = 0; i < al.size(); i++) {
                            if (recyclerView.findViewHolderForAdapterPosition(i)!=null) {
                            ((RecyclerViewAdapter.ViewHolderItem) recyclerView.findViewHolderForAdapterPosition(i)).tv.startAnimation(animation);
                            }

                        }
                                            }
                },50);