17

シナリオ:-

私は2つを持っていますArrayList

リストには画像が含まれています

postList には、選択した画像の位置が含まれています

画像を選択して削除メニューを押すと、選択した画像が削除されます。

でコードを実行するdebugと、正常に動作し、希望の出力が得られます。

しかし、通常モードで実行していると、クラッシュして上記のようになりexceptionます。

if (posList.size() > 0)
{
    Toast.makeText(getBaseContext(), "i value" +posList.size(), 
                   Toast.LENGTH_SHORT).show();
    for (int i = 0; i < posList.size(); i++)
        appAdp.list.remove(appAdp.list.get(posList.get(i)));
    appAdp.notifyDataSetChanged();
    posList.clear();
    Toast.makeText(getBaseContext(), "You deleted selected items",
                   Toast.LENGTH_SHORT).show();              
}
return true;

ここにpostListの値

@Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
                boolean checked) {
            posList.add(position);

ここに表示されるエラー

appAdp.list.remove(appAdp.list.get(posList.get(i)));

logcat:-

java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2

at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)

at java.util.ArrayList.get(ArrayList.java:304)

なぜこのように振る舞うのか、何の手がかりも得られません。

助けてくれてありがとう。

4

6 に答える 6

21

同じArrayListで操作を実行しようとしているため、ArrayListから要素を削除すると、そのサイズが縮小するため、ArrayIndexoutofBoundsException. つまり、 から項目を削除する appAdp.listと、 のサイズappAdp.listも変更されます

リストに元々 3 つの要素があるかどうかを検討してください。

あなたはposList 0,2に位置を持っています

次に、 から0アイテムから アイテムを削除するappAdp.listと、そのサイズは2、次に位置 でアイテムを削除しようとすると、次の2ようになります。AIOBE

解決:

削除する必要があるすべてのアイテムを別のリストに保存し、removeAll(list)メソッドを使用してアイテムを削除しますappAdp.list

例:

ArrayList<yourappListtype> templist=new ArrayList<yourappListtype>();
for (int i = 0; i < posList.size(); i++)
        templist.add(appAdp.list.get(posList.get(i)));

その後

appAdp.list.removeAll(templist);
于 2013-05-09T11:20:20.093 に答える
1

アダプタのデータ ソースを変更する前に、アダプタのnotifyDataSetInvalidated()関数を呼び出して元のデータ ソースを無効にnotifyDataSetChanged()し、データ ソースの変更が完了してからアダプタの関数を呼び出すことができます。

于 2017-05-27T09:04:16.650 に答える
0

インデックスはゼロから始まることに注意してください。位置を取得すると、配列のインデックスよりも +1 高いので、範囲外の例外が発生すると思います

于 2013-05-09T11:07:13.557 に答える
0

エラーは Invalid index 2, size is 2

考えられる問題はあなたのposList.size()=2場所ですappAdp.list.size()<2

appAdp.list2 つ以上のエントリがあることを確認してください。

if (posList.size() >0)
i=appAdp.list.size();
while(i<=posList.size() && i<=appAdp.list.size())
{
 appAdp.list.remove(appAdp.list.get(posList.get(i)));
 i--;
}
于 2013-05-09T11:11:06.720 に答える