Отключить несколько ячеек в recycleView от прокрутки или скрыть удаление при перелистывании

У меня есть собственный recycleView с возможностью удаления. Я могу отобразить пользовательский recycleView, а также удалить элемент, проведя его. Размах для удаления реализован с использованием отдельного класса, который реализует SimpleCallback. Теперь я хочу отключить свайп, чтобы удалить или не показывать кнопку удаления, пока проводите пальцем по нескольким элементам на основе имени пользователя, отображаемого в RecycleView.

public class SwipeHelper extends ItemTouchHelper.SimpleCallback {
private RecyclerItemTouchHelperListener listener;

SwipeHelper(int dragDirs, int swipeDirs, RecyclerItemTouchHelperListener listener) {
    super(dragDirs, swipeDirs);
    this.listener = listener;
}

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



@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
    if (viewHolder != null) {
        final View foregroundView = ((Adapter.ViewHolder) viewHolder).viewforeground;

        getDefaultUIUtil().onSelected(foregroundView);
    }
}

@Override
public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
                            RecyclerView.ViewHolder viewHolder, float dX, float dY,
                            int actionState, boolean isCurrentlyActive) {
    final View foregroundView = ((Adapter.ViewHolder) viewHolder).viewforeground;
    getDefaultUIUtil().onDrawOver(c, recyclerView, foregroundView, dX, dY,
            actionState, isCurrentlyActive);
}

@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    final View foregroundView = ((Adapter.ViewHolder) viewHolder).viewforeground;
    getDefaultUIUtil().clearView(foregroundView);
}

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
                        RecyclerView.ViewHolder viewHolder, float dX, float dY,
                        int actionState, boolean isCurrentlyActive) {
    final View foregroundView = ((Adapter.ViewHolder) viewHolder).viewforeground;

    getDefaultUIUtil().onDraw(c, recyclerView, foregroundView, dX, dY,
            actionState, isCurrentlyActive);
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    listener.onSwiped(viewHolder, direction, viewHolder.getAdapterPosition());
}

@Override
public int convertToAbsoluteDirection(int flags, int layoutDirection) {
    return super.convertToAbsoluteDirection(flags, layoutDirection);
}

public interface RecyclerItemTouchHelperListener {
    void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position);
}

}

И как я реализовал

   ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new SwipeHelper(0, ItemTouchHelper.LEFT, this);
    new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);

Видоискатель в recycleView.

public class ViewHolder extends RecyclerView.ViewHolder {
    TextView uname,time,comm;
    CircleImageView civ;
    RelativeLayout viewBackground,viewforeground;

    ViewHolder(View itemView) {
        super(itemView);

        civ = (CircleImageView)itemView.findViewById(R.id.profile_image);
        uname = (TextView) itemView.findViewById(R.id.username);
        time = (TextView) itemView.findViewById(R.id.time);
        comm = (TextView) itemView.findViewById(R.id.comments);
        viewBackground = (RelativeLayout)itemView.findViewById(R.id.view_background);
        viewforeground = (RelativeLayout)itemView.findViewById(R.id.view_foreground);

    }
}

Теперь я хочу отключить пролистывание имени пользователя, которое не совпадает с uname в окне просмотра. Я искал, так что они просят внести изменения в метод SwipeDirs, но там я не могу получить значения viewHolder внутри него. Пожалуйста помоги.

1 ответ

Override getMovementFlags в вашем ItemTouchHelper.SimpleCallback, чтобы проверить держатель представления для условий, которые разрешают считывание следующим образом:

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        final int dragFlags = 0;
        final int swipeFlags;
        swipeFlags = ([OK to swipe this view]) 
            ? ItemTouchHelper.START | ItemTouchHelper.END
            : 0;
        return makeMovementFlags(dragFlags, swipeFlags);
    }
}
Другие вопросы по тегам