3

アクティビティで 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 を入れることはできません。

4

2 に答える 2

2

位置が範囲内にあることを確認してください。範囲内にある場合は、削除して次のように変更します。

if(position != -1 && position < MyCopyonWriteArrayList.size()) {
     MyCopyonWriteArrayList.remove(position); 
 }

必ずお役に立ちます

于 2012-12-21T18:51:36.977 に答える