我有一个可以对数据进行排序或过滤的 RecyclerView。我需要能够从过滤列表中删除一个元素,并从原始数据中删除相同的元素。
我创建了自己的适配器。
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Task task = data.get(position);
holder.txtName.setText(task.getName());
holder.txtDate.setText(new SimpleDateFormat("dd-MM-yyyy").format(task.getDate()));
holder.chbDone.setChecked(task.isDone());
holder.parentLayout.setOnClickListener(v -> {
Intent intent = new Intent(context, ViewDetailsActivity.class);
intent.putExtra("position", position);
context.startActivity(intent) ;
});
holder.parentLayout.setOnLongClickListener(v -> {
data.remove(position); // удаление из неотфильтрованного массива данных
notifyItemRemoved(position);
return true;
});
}
显然,您只能按位置访问元素。过滤列表时项目位置是否会改变,即 什么时候不会显示所有项目?如果是这样,那么通过删除列表的一个元素,我将删除一个根本不对应的对象。如何解决这个问题呢?
public void onBindViewHolder(@NonNull ViewHolder holder, int position)位置在这里,根据文档:仅在此方法调用期间是数据中的有效位置。删除元素时,最正确的方法是使用以下方法
ViewHolder.getAdapterPosition:您还需要考虑什么
ViewHolder.getAdapterPosition可以返回 positionRecyclerView.NO_POSITION,因此您需要进行适当的检查。notifyItemRemoved(position)导致动画从列表中删除。从列表中删除一个元素后,调用
notifyItemRangeChanged()