Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从回收器视图中删除项目会生成错误_Android_Android Recyclerview - Fatal编程技术网

Android 从回收器视图中删除项目会生成错误

Android 从回收器视图中删除项目会生成错误,android,android-recyclerview,Android,Android Recyclerview,我想从RecyclerView中删除某些项目。我可以一次删除一个项目,但无法一次删除多个项目。以下是删除项目的代码: final Online2_G_S online2_g_s = online2_g_sList.get(position); if (online2_g_s.getpMrp()==0){ removeItem(holder.getAdapterPosition()); } private void removeItem(final int position) {

我想从RecyclerView中删除某些项目。我可以一次删除一个项目,但无法一次删除多个项目。以下是删除项目的代码:

final  Online2_G_S online2_g_s = online2_g_sList.get(position);

if (online2_g_s.getpMrp()==0){
   removeItem(holder.getAdapterPosition());
}

private void removeItem(final int position) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {

            try{
                Log.i("sand36", String.valueOf(position)+" "+online2_g_sList.get(position));
                online2_g_sList.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position, online2_g_sList.size());

            }catch (Exception e){
                Log.i("sand36", String.valueOf(e));
            }
        }
});
09-14 09:09:36.816 26394-26394/com.parse.AwaazDo I/sand36: java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4   
09-14 09:09:36.817 26394-26394/com.parse.AwaazDo I/sand36: java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
09-14 09:09:36.870 26394-26394/com.parse.AwaazDo I/sand36: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
以下是删除项目时出现的错误:

final  Online2_G_S online2_g_s = online2_g_sList.get(position);

if (online2_g_s.getpMrp()==0){
   removeItem(holder.getAdapterPosition());
}

private void removeItem(final int position) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {

            try{
                Log.i("sand36", String.valueOf(position)+" "+online2_g_sList.get(position));
                online2_g_sList.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position, online2_g_sList.size());

            }catch (Exception e){
                Log.i("sand36", String.valueOf(e));
            }
        }
});
09-14 09:09:36.816 26394-26394/com.parse.AwaazDo I/sand36: java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4   
09-14 09:09:36.817 26394-26394/com.parse.AwaazDo I/sand36: java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
09-14 09:09:36.870 26394-26394/com.parse.AwaazDo I/sand36: java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1

如果您试图直接从适配器中删除该项,则可能会出现indexoutofbound异常

您需要做的是创建一个接口,该接口由recyclerview的父级实现,并在创建期间将其传递给recycler适配器,然后当您例如侦听recycler项中的remove按钮时,调用该项的interface方法,然后父级将删除该项并通知

public interface OnRecyclerItemInteraction{
  public void onItemRemoveClicked(Online2_G_S  item);
}
在父实现中:

@override
public void onItemRemoveClicked(Online2_G_S  item){
  int index = yourList.indexOf(item);
  yourList.remove(item);
  yourAdapter.notifyItemRemoved(index);
}
最后,在bindViewHolder中:

closeButton.setOnClickListener(new OnClickListener{
   @Override
            public void onClick(View view) {
                itemInteraction.onItemRemoveClicked(thisViewsItem)
            }
})
请在下面的示例中尝试此代码

notifyItemRangeChanged(position, online2_g_sList.size()); 
用上面这行

notifyItemRangeChanged(position, online2_g_sList.size());
online2_g_sList.remove(position);
notifyItemRemoved(position);`

您从哪里获得online2\u g\u列表中的位置。获取(位置)?从BindViewHolder(final OnlineAdapter.MyViewHolder holder,final int position)开始,当您尝试删除项目时,请详细说明差异。在删除项(notifyItemRangeChanged(position,online2_g_sList.size());)之前,此行更改列表大小的范围,以便只有可用的位置或数组列表大小在数组列表中。谢谢,我在将数据附加到适配器之前删除了数据,但这是解决我问题的方法。