アクティビティで BaseAdapter を拡張するアダプターがあります。アダプターで、レコードをリストします。ユーザーが任意のレコードをクリックすると、オプションが一覧表示されます。これらのオプションは「送信」と「削除」です。削除オプションはリストからレコードを削除し、送信オプションはレコードをサーバーに送信します。送信が押されると、asynctask が開始されます。削除操作には、ダイアログでハンドラーを使用します (はいまたはいいえ)。
私の問題は、他のレコードの送信中に 1 つのレコードで削除を押すと、アプリケーションがクラッシュし、この例外が発生することです。
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
at java.util.ArrayList.get(ArrayList.java:304)
E/AndroidRuntime(25140): atandroid.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
サイズを何度も確認しましたが、サイズが 0 ではありません。サイズは問題ないと確信しています。
このコードは私の削除操作からのものです。
public class MyAdapter extends BaseAdapter{
CopyOnWriteArratList<MyObject> MyCopyonWriteArrayList;
private Handler handler;
private ListView listview;
public MyAdapter(Context context,
CopyOnWriteArratList<MyObject> MyCopyonWriteArrayList,ListView listView){
this.context = context;
this.MyCopyonWriteArrayList= MyCopyonWriteArrayList;
this.listView = listView;
}
new Thread(new Runnable() {
@Override
public void run() {
//If I remove this line, app does not crash
MyObject o = MyCopyonWriteArrayList.get(position);
o.Delete();
MyCopyonWriteArrayList.remove(position);
//Code arrive here.
}
handler.post(new Runnable() {
//Code cannot arrive here
@Override
public void run() {
progressDialog.dismiss();
deleteDoneListener.deleteDone();
}
});
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
私の非同期タスクは非常に典型的です。
私の質問は、なぜこの例外「インデックス 0 、サイズ 0」が発生したのかということです。このサイズは myarraylist のサイズではありません。
このコードを修正するにはどうすればよいですか? また、このサイズの原因は何ですか?
また、削除でハンドラーの代わりに asynctask を使用すると、「Looper.prepare()] を呼び出していないスレッド内でハンドラーを作成できません」という例外が発生しました。そのため、ダイアログに asyncack を入れることはできません。