【问题标题】:list.remove() error in recyclerviewrecyclerview 中的 list.remove() 错误
【发布时间】:2017-04-22 13:38:53
【问题描述】:

我有列表,每行都有复选框,我尝试获取所有复选框的位置,然后循环遍历它并使用 list.remove(indexOfpostion) 删除每一行 但它会抛出 java.lang.IndexOutOfBoundsException

注意:我的列表名称是“Dish”。

代码:

 public void removeAtAll() {


    Iterator it = selectedCheckBox.entrySet().iterator();
    if(!it.hasNext()){

        new makeDialog().makeDialog(mContext,mContext.getResources().getString(R.string.share_no_data));

    }
    else {
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry) it.next();
            int key = (Integer) pair.getKey();
            if ((Boolean) pair.getValue()) {
                //  it.remove();
                DishToDel.add(dish.get(key).getDishID());

            }
        }
            //
        for (Object o : selectedCheckBox.entrySet()) {
            Map.Entry pair2 = (Map.Entry) o;
            int key2 = (Integer) pair2.getKey();
            if ((Boolean) pair2.getValue()) {

                dish.remove(getItem(key2));  // error here 
                notifyItemRemoved(key2);
                notifyItemRangeChanged(key2, dish.size());
            }
        }
        chooseAllradioButton.setSelected(false);
        favhtask = new FavAsyncTaskDelete(mContext, DishToDel);
        favhtask.execute();
    }
    // process message deleteing

}

错误日志

FATAL EXCEPTION: main
Process: com.TopLine.nokhbatalatbaq, PID: 32327
java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
    at java.util.ArrayList.get(ArrayList.java:411)
    at com.TopLine.nokhbatalatbaq.adapter.FavAdapterDishes.removeAtAll(FavAdapterDishes.java:344)
    at com.TopLine.nokhbatalatbaq.adapter.FavAdapterDishes$4.onClick(FavAdapterDishes.java:151)
    at android.view.View.performClick(View.java:6205)
    at android.view.View$PerformClick.run(View.java:23653)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6682)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

【问题讨论】:

  • 可以添加错误日志吗?
  • 完成,请注意,当我的菜肴列表有三个选定框时,然后在最后一个尝试从列表中删除它尝试获取 position = 2 ,但列表现在只有一个元素位置0 ,那么如何只从我的列表中删除一些行?
  • 你的 getItem 最有可能做什么这种方法不能在列表缩小时自我调整,但它是唯一的假设。
  • 做。不是。利用。生的。类型!

标签: java android listview arraylist android-recyclerview


【解决方案1】:

您在迭代条目集时使用 dish.remove(getItem(key2)) 从条目集中删除了一个项目,我原以为会抛出 ConcurrentModificationException,但显然您有一些 List 未能向我们展示被getItem使用,你也没有向我们展示,所以也许这就是IndexOutOfBoundsException的原因。

另外,你为什么要在DishToDel 上调用静态方法?这似乎是对实例方法的调用。

通常,您应该能够在一个基于迭代器的循环中进行循环和删除,但您的事情太复杂了,无法确切知道您要做什么。

单独创建任何东西

new makeDialog().makeDialog(mContext,mContext.getResources().getString(R.string.share_no_data));

正在尝试从方法removeAtAll 创建并将结果分配给某物,或将其传递给某处,这样它就不仅仅是一条无用的行。方法应该有一个单一的目的,而不是多个,尤其是不能相互矛盾的目的。

清理完代码后,您会发现诊断任何错误并为它们寻求帮助变得更加容易。如果您确实寻求帮助,请给出一个完整的示例来说明您的问题。不要隐藏所有相关信息。

并且不要使用原始类型!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-15
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多