как установить itemTouchHelper проведите выборочно? - PullRequest
0 голосов
/ 10 ноября 2018

, поэтому я реализовал этот обратный вызов itemtouchhelper.simple на rv.

Теперь в этой версии я установил 2 вида макета в виде строки в зависимости от типа контента.

, так как я установил этот сенсорный помощник на rv, он реализуется на обоих этих макетах, хотя я не хотел этого делать. Я хочу применить этот удар только к одному типу этого макета.

ItemTouchHelper.SimpleCallback ith = new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
            if(viewHolder.itemView.findViewById(R.id.messageholder_from) != null)
            {
                Log.d("texts", "onSwiped: "+viewHolder.itemView.findViewById(R.id.messageholder_from).findViewById(R.id.crfrom));
            }
            adapter.notifyDataSetChanged();
        }
    };
    new ItemTouchHelper(ith).attachToRecyclerView(rv);

как вы можете видеть в этом коде, я только хочу реализовать свайп в строке, в которой есть этот messageholder_from дочерний элемент, в противном случае я не хочу реализовывать свайп.

есть ли способ удалить анимацию смахивания и прослушиватель для этого другого дочернего messageholder_to.

мое приложение отображает либо to_layout, либо from_layout в зависимости от идентификатора сообщения.

спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

int makeMovementFlags (int dragFlags, int swipeFlags) отвечает за каждое перемещение строки, смахивание или перетаскивание.

Из документации:

Удобный метод для создания флагов движения.

Например, если вы хотите, чтобы ваши элементы перетаскивались по вертикали и проведен влево, чтобы быть отклоненным, вы можете вызвать этот метод с: makeMovementFlags (UP | DOWN, LEFT);

Реализуйте метод getMovementFlags () и верните с помощью makeMovementFlags(0, 0);, для какой строки или области просмотра вы не хотите добавлять пролистывание или перетаскивание.

Пример кода:

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

    int dragFlags = 0;
    int swipeFlags = 0;

    if (recyclerView.getLayoutManager().getClass() == LinearLayoutManager.class ) {

        LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        int orientation = linearLayoutManager.getOrientation();

        if (orientation == LinearLayoutManager.VERTICAL) {

            swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;


        }else {
            // horizontal
            dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            // no swipe for horizontal layout
            swipeFlags = 0;
        }

    }

    if (viewHolder.getAdapterPosition() == 3) {
         // disable swipe feature for position 3 
        return makeMovementFlags(0, 0);
    }


    return makeMovementFlags(dragFlags, swipeFlags);
}
0 голосов
/ 10 ноября 2018

Внутри ItemTouchHelper.SimpleCallback переопределите метод getSwipeDirs() и верните 0 для любой строки, для которой вы хотите отключить смахивание.

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder.itemView.findViewById(R.id.messageholder_from) == null) {
        return 0;
    }

    return super.getSwipeDirs(recyclerView, viewHolder);
}

В зависимости от того, как именно настроено ваше приложение, может быть лучший способ обнаружить, что viewHolder - это тот тип, на котором вы хотите запретить считывание. Например, может быть, вы могли бы иметь

if (viewHolder instanceof WrongKindOfViewHolder)

или

if (viewHolder.isNotSwipeable)
...