Android 从回收器视图中删除项目时,如何通知onBindViewHolder?
因此,我的问题是,我想从Android 从回收器视图中删除项目时,如何通知onBindViewHolder?,android,android-recyclerview,android-viewholder,Android,Android Recyclerview,Android Viewholder,因此,我的问题是,我想从RecyclerView中删除一行,但它给了我一个错误 检测到不一致。视图保持器适配器无效 我的代码片段是: @Override public void onBindViewHolder(MyViewHolder holder, final int position) { holder.textViewTitle.setText(imageGalleryList.get(position).title);
RecyclerView
中删除一行,但它给了我一个错误
检测到不一致。视图保持器适配器无效
我的代码片段是:
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.textViewTitle.setText(imageGalleryList.get(position).title);
holder.textViewTitleDesc.setText(imageGalleryList.get(position).comment);
holder.textViewImageCreateInfo.setText(imageGalleryList.get(position).createUserId + " "/*+ UtilityOfActivity.convertLongDateToShortDateTime(getJCImageBySerialResponse[position].createDate)*/);
// imageLoader.displayImage(getJCImageBySerialResponse[position].imageUrl, holder.uploadedImage);
holder.btnDeleteImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
imagePosition = position;
//calling the custom dialog
CustomDialogTwoButtons.showDialog(context, Constant.calledByDataSheetImageGallery,
Constant.calledBy_delete_image_gallery,
Constant.Confirm_Image_Deletion, Constant.Confirm_Image_Deletion_Message,
Constant.DialogPositiveButton, Constant.DialogNegativeButton);
}
});
// override interface method
public void dialogItemClick(Context context, String calledBy) {
Toast.makeText(context, " " + imagePosition, Toast.LENGTH_SHORT).show();
removeItemFromView(imagePosition);
}
//method to remove item from the recycler view row
public void removeItemFromView(int position) {
this.imageGalleryList.remove(position);
notifyItemChanged(position);
notifyItemRemoved(position);
notifyDataSetChanged();
//removes the row
}
这是我对话框的代码:
public class CustomDialogTwoButtons extends Activity
{
public static void showDialog(final Context context, final String calledByFragment,
final String calledBy,
String title, String message,
String positiveButton, String negativeButton) {
final Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawableResource(R.color.transparent);
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.setContentView(R.layout.custom_dialog_two_buttons);
TextView txtTitle = (TextView) dialog.findViewById(R.id.txtTitle);
TextView txtMessage = (TextView) dialog.findViewById(R.id.txtMessage);
Button btnPositive = (Button) dialog.findViewById(R.id.btnPositive);
Button btnNegative = (Button) dialog.findViewById(R.id.btnNegative);
txtTitle.setText(title);
txtMessage.setText(message);
btnPositive.setText(positiveButton);
btnNegative.setText(negativeButton);
btnPositive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "Positive ", Toast.LENGTH_SHORT).show();
CustomDialogInterface reference = null;
if (calledByFragment.equalsIgnoreCase(Constant.calledByDataSheetOrderInfo)) {
if (calledBy.equalsIgnoreCase(Constant.DELETE_CUST_VOICE)) {
reference = new DataSheetOrderInfo();
}
else if (calledBy.equalsIgnoreCase(Constant.EDIT_CUST_VOICE)) {
reference = new DialogFragmentAddEditDeleteCustVoice();
} else if (calledBy.equalsIgnoreCase(Constant.ADD_CUST_VOICE)) {
reference = new DialogFragmentAddEditDeleteCustVoice();
}
}
else if(calledByFragment.equalsIgnoreCase(Constant.calledByCreateRepairOrderFragment)) {
if (calledBy.equalsIgnoreCase(Constant.DELETE_CUST_VOICE)) {
reference = new FragmentCreateRepairOrder();
} else if (calledBy.equalsIgnoreCase(Constant.EDIT_CUST_VOICE)) {
reference = new CustomDialogEditCustVoice();
} else if (calledBy.equalsIgnoreCase(Constant.ADD_CUST_VOICE)) {
reference = new FragmentCreateRepairOrder();
}
}
else if(calledByFragment.equalsIgnoreCase(Constant.calledByDataSheetImageGallery)) {
if (calledBy.equalsIgnoreCase(Constant.calledBy_delete_image_gallery)) {
reference = (CustomDialogInterface) new ImageUploadAdapter();
}
}
reference.dialogItemClick(context, calledBy);
dialog.cancel();
}
});
btnNegative.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "Negative ", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
dialog.show();
}
public interface CustomDialogInterface {
void dialogItemClick(Context context, String calledBy);
}
}
因此,问题是,当我从我的接口实现方法调用
removietemfromView
时,它不会更新onBindViewHolder
,我想知道如何通知onBindViewHolder
项目已删除。在removietemfromView
中尝试此代码
public void removeItemFromView(int position) {
try{
this.imageGalleryList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, imageGalleryList.size())
//removes the row
} catch (Exception e){
notifyDataSetChanged();
e.printStackTrace();
}
}
首先,getItemCount应该返回列表的大小。这里,图片画廊 然后只需单独调用notifyItemRemoved(位置)
同样的问题,问题是当removeItemFromView(int position)完成其执行时,它在dialogItemClick上返回,并且没有向onBlindViewHolder通知任何内容。您是否捕获到任何异常?相同的java.lang.IndexOutOfBoundsException:检测到不一致。无效项目位置5(偏移量:5).state:6请参见:将位置传递给showDialog,并在DialogItem中单击添加第三个参数,因为位置无法执行此操作,因为我在应用程序中使用对话框的位置不止一个,请调用相同的方法尝试在ViewHolder内单击Listners设置,并按如下方式获取layoutposition
int position=getLayoutPosition()代码>注释已更改的项目(位置);已移除(位置)的项目;检查一下
public void removeItemFromView(int position) {
this.imageGalleryList.remove(position);
notifyItemRemoved(position);
}