对RecyclerView滑动以关闭

Vik*_*nin 116 android android-recyclerview

我曾经使用SwipeToDismiss库,但现在我正在尝试迁移到RecyclerView,事情并不那么明显,你知道这个lib的替代品吗?任何想法如何从头开始实现它?

jmc*_*ale 335

从v22.2.0开始,Android支持团队已经包含了一个ItemTouchHelper使刷卡到解除和拖放非常简单的类.这可能不像某些库那样功能齐全,但它直接来自Android团队.

  • 更新build.gradle以导入RecyclerView库的v22.2.+

    compile 'com.android.support:recyclerview-v7:22.2.+'
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用适当的SimpleCallback实例化ItemTouchHelper

    ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        [...]
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            //Remove swiped item from list and notify the RecyclerView
        }
    };
    
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
    
    Run Code Online (Sandbox Code Playgroud)

    **请注意,SimpleCallback会引导您要启用拖放的方向以及要启用滑动的路线.

  • 附加到您的RecyclerView

    itemTouchHelper.attachToRecyclerView(recyclerView);
    
    Run Code Online (Sandbox Code Playgroud)

  • @Orochi通过在`viewHolder`上调用[g​​etAdapterPosition()](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition%28%29). (37认同)
  • 如何获得刷卡项目的索引? (7认同)
  • 如果我想在用户部分滑动然后将视图拖回原位时处理这种情况怎么办?显然这是不可能的(?)编辑:好的,这是可能的,但是在释放视图之前你可以留下很小的余量.有什么建议吗? (4认同)
  • @Matteo:实现ItemTouchHelper.Callback并覆盖getSwipeThreshold() (2认同)

Khy*_*nia 32

 ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
            final int position = viewHolder.getAdapterPosition(); //get position which is swipe

            if (direction == ItemTouchHelper.LEFT) {    //if swipe left

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //alert for confirm to delete
                builder.setMessage("Are you sure to delete?");    //set message

                builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        adapter.notifyItemRemoved(position);    //item removed from recylcerview
                        sqldatabase.execSQL("delete from " + TABLE_NAME + " where _id='" + (position + 1) + "'"); //query for delete
                        list.remove(position);  //then remove item

                        return;
                    }
                }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {  //not removing items if cancel is done
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        adapter.notifyItemRemoved(position + 1);    //notifies the RecyclerView Adapter that data in adapter has been removed at a particular position.
                        adapter.notifyItemRangeChanged(position, adapter.getItemCount());   //notifies the RecyclerView Adapter that positions of element in adapter has been changed from position(removed element index to end of list), please update it.
                        return;
                    }
                }).show();  //show alert dialog
            }
        }
    };
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
    itemTouchHelper.attachToRecyclerView(recyclerView); //set swipe to recylcerview
Run Code Online (Sandbox Code Playgroud)

在代码中如果用户向左滑动则显示AlertDialog,如果用户选择REMOVE,则会从数据库中删除item并刷新recyclelerview,如果用户选择CANCEL,则recyclelerview就是这样.


Pie*_*ini 14

也许你可以尝试这个库:

https://github.com/daimajia/AndroidSwipeLayout

更新:我刚刚发现了另一个可以与RecyclerView一起使用的好库:

https://github.com/hudomju/android-swipe-to-dismiss-undo