У меня есть 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()
Эти документы неправильные?