在RecyclerView中禁用某些行的ItemTouchHelper滑动功能

5

我只是使用以下方法在我的数据列表上进行向右和向左滑动,它运行良好。我想知道如何禁用某些行的滑动操作。

例如:有些数据用户不应该删除。我想限制这些行。

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


        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

            //Remove swiped item from the list and notify the RecyclerView

        }
        @Override
        public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

        }
    };
2个回答

16

使用您的ItemTouchHelper.SimpleCallbackgetMovementFlags()方法。您需要通过不返回滑动标记来检测您不想允许滑动的视图持有者。

这里提供了一个禁止网格布局中滑动的示例。

  @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        // Set movement flags based on the layout manager
        if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            final int swipeFlags = 0;
            return makeMovementFlags(dragFlags, swipeFlags);
        } else {
            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
            final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
            return makeMovementFlags(dragFlags, swipeFlags);
        }
}

1
谢谢。我使用了相同的方法,对于不可滑动的行,只需返回0即可。 - Im Batman

3
我希望你能禁用滑动功能,其中对象标记类型不等于1。请保留HTML标签。
 @Override
        public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            final int position = viewHolder.getAdapterPosition();

            int sectionIndex = listAdapter.getSectionForAdapterPosition(position);
            int itemIndex = listAdapter.getPositionOfItemInSection(sectionIndex, position);

            myModelObject temp = filteredArrayList.get(sectionIndex).get(itemIndex);

            if(!temp.getMarkedType().equals("1")){
                return 0;
            }

            return super.getSwipeDirs(recyclerView, viewHolder);
        }

这个对我有效,谢谢! - noloman

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