Android - 轻扫以删除RecyclerView

Mon*_*oya 35 android android-recyclerview

我正在尝试实施滑动以删除与Gmail应用"滑动到存档"相同的内容:

gmail滑动删除 gmail滑动删除

我已经尝试了很多教程,但没有一个像gmail一样快,我更喜欢不在外部库上工作.我该怎么做?

编辑:

我的代码到目前为止 -

  ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
                public boolean onMove(RecyclerView recyclerView,
                                               RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//                    final int fromPos = viewHolder.getAdapterPosition();
//                    final int toPos = viewHolder.getAdapterPosition();
//                    // move item in `fromPos` to `toPos` in adapter.
                    return true;// true if moved, false otherwise
                }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
                //Remove swiped item from list and notify the RecyclerView
                mAdapter.notifyItemRemoved(viewHolder.getLayoutPosition());
            }
        };
        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
        itemTouchHelper.attachToRecyclerView(mRecyclerView);
Run Code Online (Sandbox Code Playgroud)

我已设法启用滑动手势,但我不知道如何在viewHolder下添加背景和图像.我试图将另一个FrameLayout放在item_XXX.xml文件中但是在滑动时它会抛出整个项目的背景.

Rah*_*ina 33

RecyclerView Swipe的简单代码:

     ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.DOWN | ItemTouchHelper.UP) {

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                Toast.makeText(ListActivity.this, "on Move", Toast.LENGTH_SHORT).show();
                return false;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
                Toast.makeText(ListActivity.this, "on Swiped ", Toast.LENGTH_SHORT).show();
                //Remove swiped item from list and notify the RecyclerView
                int position = viewHolder.getAdapterPosition();
                arrayList.remove(position);
                adapter.notifyDataSetChanged();

            }
     };
Run Code Online (Sandbox Code Playgroud)

然后使用以下语句为recyclelerView设置回调:

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
 itemTouchHelper.attachToRecyclerView(rv);
Run Code Online (Sandbox Code Playgroud)

  • 对于更窒息的动画,您可以使用“adapter.notifyItemRemoved(position)”而不是“adapter.notifyDataSetChanged();” (6认同)

Nem*_*vic 24

前几天我不得不这样做,我遇到了一些问题所以我决定写一篇博文.不需要第三方库.

基本上,你不会通过onChildDraw它来绘制"撤消状态" ,它将通过ViewHolder.此外,您实际上不会删除行,onSwipe只需将其标记为"待删除",并通知适配器以"撤消状态"重新绑定它.Runnable除非按下撤消按钮,否则你会在x秒内发布实际删除行...


Joh*_*ada 8

onCreate这是设置“向左滑动删除”的最少代码:

binding.rows.adapter = adapter
ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
    override fun onMove(v: RecyclerView, h: RecyclerView.ViewHolder, t: RecyclerView.ViewHolder) = false
    override fun onSwiped(h: RecyclerView.ViewHolder, dir: Int) = adapter.removeAt(h.adapterPosition)
}).attachToRecyclerView(binding.rows)
Run Code Online (Sandbox Code Playgroud)

这假设你的Adapter类有一个removeAt函数。我的看起来像这样:

fun removeAt(index: Int) {
    items.removeAt(index)   // items is a MutableList
    notifyItemRemoved(index)
}
Run Code Online (Sandbox Code Playgroud)

感谢 @RahulRaina 您的 Java 回答!