Android - Recycler视图设置项不可刷卡

时间:2015-12-01 17:09:02

标签: android android-recyclerview

我正在使用RecyclerViewItemTouchHelper.SimpleCallback => onSwiped方法。回收站视图中的某些项目正在进行中,我想禁用它们的滑动。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

您可以在ItemTouchHelper.SimpleCallback中覆盖getSwipeDirs()。当你不希望一件物品可以刷卡时,返回0。

此方法的第二个参数是正在滑动的项目的ViewHolder-您可以向ViewHolder添加一个简单的标记,以指示它是否可以滑动。

例如:

static class SwipeViewHolder extends RecyclerView.ViewHolder {
    public boolean isSwipeable;

    public SwipeViewHolder(View itemView) {
        super(itemView);
    }
}

回调:

static class DragAndSwipeCallback extends ItemTouchHelper.SimpleCallback {

    public DragAndSwipeCallback(int dragDirs, int swipeDirs) {
        super(dragDirs, swipeDirs);
    }

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

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        // Remove item
    }

    @Override
    public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        if (viewHolder instanceof SwipeViewHolder
                && ((SwipeViewHolder) viewHolder).isSwipeable) {
            return super.getSwipeDirs(recyclerView, viewHolder);
        } else {
            return 0;
        }
    }
}

答案 1 :(得分:0)

在我的情况下,我注意到getSwipeDirs()没有被调用,可能是因为我也设置了MovementFlags。

我也必须覆盖getMovementFlags(),如下:

        @Override
        public int getMovementFlags(RecyclerView recyclerView,
                                    RecyclerView.ViewHolder viewHolder) {
            if (viewHolder instanceof SwipeViewHolder
                    && ((SwipeViewHolder) viewHolder).isSwipeable) {
                return makeMovementFlags(0, super.getSwipeDirs(recyclerView, viewHolder));
            } else {
                return makeMovementFlags(0, 0);
            }
        }