简体   繁体   English

Android单击按钮即可删除所有带有动画的recyclerview

[英]Android remove all recyclerview with animation on a button click

I have a recycler view. 我有一个回收站视图。 On a button click I want to remove all the items from the recyclerview but the items must be removed with animation. 在按钮上单击我想从recyclerview中删除所有项目,但是必须使用动画删除这些项目。 I am able to remove all the items at once but I don't know how to remove them with animation. 我能够一次删除所有项目,但是我不知道如何通过动画删除它们。 Thanks 谢谢

It's old, but wish this helps someone else as it's already not answered yet; 它已经很旧了,但希望它能对其他人有所帮助,因为它尚未得到答复。 I have done it by deleting a single item at a time by simulating a swipe animation on this item, and post a delay before deleting the next item, and so on to the way down to the last item of the RecyclerView 我通过模拟一个项目的滑动动画来一次删除一个项目,并在删除下一个项目之前发布了一个延迟,依此类推直到RecyclerView的最后一个项目

Step No.1: 步骤1:

In your activity that holds the clear all button and the RecyclerView instance: Create a method of single item delete 在包含清除所有按钮和RecyclerView实例的活动中:创建删除单个项目的方法

private void deleteItem(View rowView, final int position) {

    Animation anim = AnimationUtils.loadAnimation(requireContext(),
            android.R.anim.slide_out_right);
    anim.setDuration(300);
    rowView.startAnimation(anim);

    new Handler().postDelayed(new Runnable() {
        public void run() {
            if (myDataSource.size() == 0) {
                addEmptyView(); // adding empty view instead of the RecyclerView
                return;
            }
            myDataSource.remove(position); //Remove the current content from the array
            myRVAdapter.notifyDataSetChanged(); //Refresh list
        }

    }, anim.getDuration());
}

Step No.2: 步骤2:

Create the method that will delete all RecyclerView list items >> call it in your button click callback. 创建将删除所有RecyclerView列表项的方法>>在按钮单击回调中调用它。

boolean mStopHandler = false;

private void deleteAllItems() {

    final Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {

            if (myDataSource.size() == 0) {
                mStopHandler = true;
            }

            if (!mStopHandler) {
                View v = myRecyclerView.findViewHolderForAdapterPosition(0).itemView;
                deleteItem(v, 0);
            } else {
                handler.removeCallbacksAndMessages(null);
            }

            handler.postDelayed(this, 250);
        }
    };
    requireActivity().runOnUiThread(runnable);
}

Also it's important to handle configuration change in manifest, activity section, as if the configuration changes while clearing your recycler view list, an exception will be raised 同样重要的是,在清单,活动部分中处理配置更改,就像在清除回收者视图列表时配置更改一样,也会引发异常

<activity
    android:name=".activities.MainActivity"
    android:configChanges="orientation|screenSize|keyboard"
    android:label="@string/app_name">
    ...
</activity>

This is a pretty good library and what's better is the documentation for it. 是一个非常不错的库,更好的是它的文档。 You can even insert durations for transitions and animations. 您甚至可以插入转场和动画的持续时间。

Also, remember that if you are using default animation, after calling myDataSet.remove(pos) using adapter.notifyDataSetChanged() while there is an animation ongoing will cause the animation to stop. 另外,请记住,如果使用的是默认动画,则在正在进行动画的情况下使用adapter.notifyDataSetChanged()调用myDataSet.remove(pos)之后,动画将停止。

Extend BaseItemAnimator class of recyclerview-animators library: 扩展recyclerview-animators库的BaseItemAnimator类:

MyAdapter adapter = new MyAdapter(null);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setAdapter(adapter);
recyclerView.setItemAnimator(new MyScaleInLeftAnimator());

findViewById(R.id.button).setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int count = adapter.getItemCount();
            adapter.clear();
            adapter.notifyItemRangeRemoved(0, count);
        }
    }
);

... ...

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder{
    private ArrayList<String> mItems;

    ...

    public void clear() {
        if (mItems != null) {
            mItems.clear();
        }
    }

}

... ...

public class MyScaleInLeftAnimator extends BaseItemAnimator {

    private long lastRemoval;
    private int removeCount;

    public MyScaleInLeftAnimator() {
        lastRemoval = 0;
        removeCount = 0;
    }

    public MyScaleInLeftAnimator(Interpolator interpolator) {
        mInterpolator = interpolator;
        lastRemoval = 0;
        removeCount = 0;
    }

    @Override protected void preAnimateRemoveImpl(RecyclerView.ViewHolder holder) {
        ViewCompat.setPivotX(holder.itemView, 0);
    }

    @Override protected void animateRemoveImpl(final RecyclerView.ViewHolder holder) {
        long time = System.currentTimeMillis();
        long d = time - lastRemoval;
        if (d < 100) {
            removeCount++;
        } else {
            removeCount = 0;
        }
        lastRemoval = time;
        ViewCompat.animate(holder.itemView)
                .scaleX(0)
                .scaleY(0)
                .setDuration(getRemoveDuration())
                .setInterpolator(mInterpolator)
                .setListener(new DefaultRemoveVpaListener(holder))
                .setStartDelay(removeCount * 100)
                .start();
    }

    @Override protected void preAnimateAddImpl(RecyclerView.ViewHolder holder) {
        ViewCompat.setPivotX(holder.itemView, 0);
        ViewCompat.setScaleX(holder.itemView, 0);
        ViewCompat.setScaleY(holder.itemView, 0);
    }

    @Override protected void animateAddImpl(final RecyclerView.ViewHolder holder) {
        ViewCompat.animate(holder.itemView)
                .scaleX(1)
                .scaleY(1)
                .setDuration(getAddDuration())
                .setInterpolator(mInterpolator)
                .setListener(new DefaultAddVpaListener(holder))
                .setStartDelay(getAddDelay(holder))
                .start();
    }
}

This is how I have done without using any libraries - by inserting delays in the loop to remove items & restore (if needed) 这就是我不使用任何库的方式-通过在循环中插入延迟以删除项目并还原(如果需要)

clearItemsView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final List<LineItem> lineItemsCopy = new ArrayList<>(lineItems);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i=0; i<lineItemsCopy.size(); i++) {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                salesOrderItemListAdapter.removeItem(0);
                            }
                        });
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
            Snackbar snackbar = Snackbar.make(coordinatorLayout, getString(R.string.items_cleared_message), Snackbar.LENGTH_LONG)
                    .setAction(getString(R.string.label_undo), new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            new Thread(new Runnable() {
                                @Override
                                public void run() {
                                    for (int i=0; i<lineItemsCopy.size(); i++) {
                                        final int finalI = i;
                                        runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {
                                                salesOrderItemListAdapter.restoreItem(lineItemsCopy.get(finalI), 0);
                                            }
                                        });
                                        try {
                                            Thread.sleep(500);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }
                            }).start();
                        }
                    }).setActionTextColor(Color.YELLOW);
            snackbar.show();
        }
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM