события движения андроида, не вызванные слушателем сопротивления - PullRequest
0 голосов
/ 03 сентября 2018

Задача

Таким образом, у меня есть представление рециркулятора, заполненное представлениями карт, все с прикрепленными прослушивателями перетаскивания, события движения работают нормально, пока я не установлю представление, которое будет перетаскиваться, поэтому с закомментированной строкой это работает, все журналы печатаются отлично

holder.handleView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (MotionEventCompat.getActionMasked(event)){
                case MotionEvent.ACTION_DOWN:
                    Log.d("Adptr" , "ACTION_DOWN");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation_pressed));
                    //mDragStartListener.onStartDrag(holder);
                    return true;
                case MotionEvent.ACTION_UP:
                    Log.d("Adptr" , "ACTION_UP");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation));
                    break;
                case MotionEvent.ACTION_CANCEL:
                    Log.d("Adptr" , "ACTION_CANCEL");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation));
                    break;
            }
            return false;
        }
    });

но если я раскомментирую строку

mDragStartListener.onStartDrag(holder);

тогда ACTION_UP больше не вызывается, и я не понимаю, почему

слушатель интерфейса

public interface OnStartDragListener {
    void onStartDrag(RecyclerView.ViewHolder viewHolder);
}

Я внедряю его в свою деятельность и передаю его адаптеру

@Override
    public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
        mItemTouchHelper.startDrag(viewHolder);
    }

Мой метод onMove это

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

и в моем адаптере у меня есть onItemMove из интерфейса

public interface ItemTouchHelperAdapter {
  boolean onItemMove(int fromPosition, int toPosition);
  void onItemDismiss(int position);
}


@Override
  public boolean onItemMove(int fromPosition, int toPosition) {
    if (fromPosition < toPosition){
        for (int i = fromPosition; i < toPosition; i++){
            Collections.swap(cardMakerList,i,i+1);
        }
    }else{
        for (int i = fromPosition; i > toPosition; i--){
            Collections.swap(cardMakerList,i,i-1);
        }
    }
    notifyItemMoved(fromPosition,toPosition);
    return true;
}

1 Ответ

0 голосов
/ 03 сентября 2018

Попробуйте добавить ниже и запустите:

holder.handleView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (MotionEventCompat.getActionMasked(event)){
                case MotionEvent.ACTION_DOWN:
                    Log.d("Adptr" , "ACTION_DOWN");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation_pressed));
                    //mDragStartListener.onStartDrag(holder);
                    return true;
                case MotionEvent.ACTION_MOVE:
                        Log.d("Adptr" , "ACTION_MOVE");
                        return true;
                case MotionEvent.ACTION_UP:
                    Log.d("Adptr" , "ACTION_UP");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation));
                    break;
                case MotionEvent.ACTION_CANCEL:
                    Log.d("Adptr" , "ACTION_CANCEL");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation));
                    break;
            }
            return false;
        }
    });

Так как согласно вашему коду поток не верен. Если вы вернете false в любом действии Motion до ACTION_UP, то код ACTION_UP не будет вызываться.

P.S: Я предпочитаю возвращать true из onTouch до тех пор, пока я не позабочусь об особых случаях. Если есть особый случай, верните правильное логическое значение.

holder.handleView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (MotionEventCompat.getActionMasked(event)){
                case MotionEvent.ACTION_DOWN:
                    Log.d("Adptr" , "ACTION_DOWN");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation_pressed));
                    //mDragStartListener.onStartDrag(holder);
                    return true;
                case MotionEvent.ACTION_UP:
                    Log.d("Adptr" , "ACTION_UP");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation));
                    break;
                case MotionEvent.ACTION_CANCEL:
                    Log.d("Adptr" , "ACTION_CANCEL");
                    holder.cardView.setCardElevation(context.getResources().getDimensionPixelSize(R.dimen.elevation));
                    break;
            }
            return true;
        }
    });
...