我有recyclerview
显示我的数据。在我的适配器类onBindViewHolder()
中,我创建了一个按钮的监听器,该按钮在单击时删除一行。第一次工作正常,但如果我尝试删除一个项目,位置值就像列表的大小没有改变一样。
所以例如我有一个4项目列表。我删除第3项(索引2)。第4个项目进入第3个插槽,列表的大小变为3.如果我尝试删除第3个项目,我得到IndexOutOfBoundsException
,因为项目位置尚未更新且其索引仍然是3,而大小是3。
以下是我onBindViewHolder()
方法的部分代码:
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
ItemRegistered item = registeredList.get(position);
if (holder.getItemViewType() == 0) {
final RegisteredViewHolder registeredViewHolder = (RegisteredViewHolder) holder;
registeredViewHolder.course.setText(item.getCourse());
registeredViewHolder.btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
if (mButtonClickListener != null) {
Log.d("i", Integer.toString(position));
Log.d("list size:", Integer.toString(registeredList.size()));
final String title = registeredList.get(position).getCourse();
mButtonClickListener.onButtonClicked(title);
}
registeredList.remove(holder.getAdapterPosition());
notifyItemRemoved(position);
break;
case DialogInterface.BUTTON_NEGATIVE:
//No button clicked
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(registeredViewHolder.course.getContext());
builder.setMessage("Jeni të sigurtë që doni të çregjistroheni?").setPositiveButton("Po", dialogClickListener)
.setNegativeButton("Jo", dialogClickListener).show();
}
});
}
}
答案 0 :(得分:1)
尝试从列表中删除项目,然后通知适配器。
即取代这一行...
registeredList.remove(holder.getAdapterPosition());
notifyItemRemoved(position);
remove(position);
现在只需创建一个方法并添加逻辑..
public void remove(int position){
registeredList.remove(position);
notifyItemRemoved(position);
// to animate the list deletion
notifyItemRangeChanged(position, getItemCount());
}
希望它有所帮助:)