Удаленная строка RecyclerView все еще получает события щелчка? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть RecyclerView, показывающий список предметов.ViewHolder для каждой строки содержит кнопку удаления, чтобы удалить строку.Если я удаляю последнюю строку и очень быстро нажимаю на исчезающую строку, я могу вывести приложение из строя, поскольку второе событие касания доставляется в удаленную строку.Я удивлен, что Android доставляет второе событие.Прежде чем я попытаюсь добавить что-то вроде boolean isDeleted в свой подкласс ViewHolder, я задаюсь вопросом: я что-то не так делаю, чтобы попасть в эту ситуацию?

class MyAdapter extends RecyclerView.Adapter<MyViewHolder> 
                implements ItemTouchHelperAdapter {

    List<Segment> segments;
    MyAdapter(List<Segment> objs) {
        this.segments = objs;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LinearLayout v = (LinearLayout) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.segment_edit_row, parent, false);
        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Segment seg = segments.get(position);
        holder.textView.setText(seg.getTitle());

        holder.dragHandle.setOnTouchListener((v, event) -> {
            if (MotionEventCompat.getActionMasked(event) ==
                    MotionEvent.ACTION_DOWN) {
                onStartDrag(holder);
            }
            return false;
        });
        holder.deleteButton.setOnClickListener(v -> {                
            segments.remove(position);
            notifyItemRemoved(position);
        });

        View.OnClickListener editExerciseListener = v -> {                
            Segment segment = segments.get(position);
            startEditSegmentActivity(segment, position);
        };

        holder.textView.setOnClickListener(editExerciseListener);
        holder.arrow.setOnClickListener(editExerciseListener);
    }

Обработчик deleteButton запускается первым,а затем editExerciseListener, с position, который сейчас находится за пределами.

Обновление

Несколько человек предложили мне позвонить notifyDataSetChanged.Документы для Android особенно рекомендуют не делать этого, если вы можете описать свое изменение с помощью вызова notifyItemRemoved.

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#notifyDataSetChanged()

Эти документы неправильные?

Ответы [ 3 ]

1 голос
/ 27 сентября 2019

Вы должны перезагружать программу повторной проверки при каждом выполнении операции удаления. Это можно сделать, добавив следующую строку:

yourAdapter.notifyDataSetChanged();
0 голосов
/ 27 сентября 2019

Первый звонок notifyItemRemoved(position);

, затем звонок segments.remove(position);

0 голосов
/ 27 сентября 2019

Обновите ваш код как:

    View.OnClickListener editExerciseListener = v -> {  

            if(position >= segments.size()){
              //index not exists
            }else{
              // index exists
            Segment segment = segments.get(position);
            startEditSegmentActivity(segment, position);
            }              

        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...