【问题标题】:IndexOutOfBoundsException when adding items to arraylist from sharedpreferences从 sharedpreferences 将项目添加到 arraylist 时出现 IndexOutOfBoundsException
【发布时间】:2014-04-02 13:12:41
【问题描述】:

我的数组列表有点问题,我需要一个解决方法来避免 IndexOutOfBoundsException 异常。

这是我添加项目的方式:

    for(Map.Entry<String,?> entry : getAll().entrySet()){ // this is a map with all my sharedprefs
        list.add((Integer) entry.getValue(), myItem);
    }

我的共享首选项以以下方式存储:

<int name="test0" value="0" />
<int name="test1" value="1" />
<int name="test2" value="2" />

所以我需要根据 int 值将项目添加到我的数组列表中。 问题出现是因为 SharedPrefereces 映射以随机方式存储值,所以当它运行时

list.add((Integer) entry.getValue(), myItem);

它抛出异常,因为它需要从 0 开始。

有人有解决办法吗?谢谢

【问题讨论】:

  • 在哪里定义list
  • 这是一个简单的 ArrayList。它不会抛出 npe!
  • 尝试做ArrayList&lt;String&gt; arr = new ArrayList&lt;String&gt;();
  • 你为什么不直接使用SharedPreference?当有一个非常好的课程可以做您已经尝试做的事情时,这种“解决方法”似乎不必要地复杂。
  • MAP 条目将按自然顺序获取值.. 字母顺序..

标签: android exception arraylist sharedpreferences indexoutofboundsexception


【解决方案1】:

解决此问题的“解决方法”是在开始添加到特定位置之前使用全 0 或其他值预先填充列表。例如:

int mapSize = mPrefMap.size(); 
for(int i = 0; i < mapSize; i++){
    listOfStuff.add(0);
}

添加等于您的偏好地图大小的数字 0 基本上会将这些位置的所有位置初始化为 0。然后您可以返回并按照您的方式添加特定值。

我仍然很困惑为什么你不只是使用标准的SharedPreference 类。这将避免这种解决方法的需要,并为您节省必须为ArrayList 设置默认值的浪费时间。

【讨论】:

    【解决方案2】:

    问题是您无法访问ArrayList 中尚不存在的index,并且由于未对Map 进行排序,因此您可能试图在索引1 插入之前有一个有效的元素索引@ 987654325@ 或在索引2 到之前有一个有效的索引01

    编辑:

    您可以使用而不是创建一个空的 ArrayList

    ArrayList<String> arr = new ArrayList<String>(getAll().entrySet());
    

    然后使用你的循环

    【讨论】:

    • 这正是问题所在,它试图在“0”之前添加“1”
    猜你喜欢
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多