错误Java.lang.indexoutofBoundSexception:无效索引0,大小为Android适配器中0



我有一个适配器,该适配器扩展了我的活动中的基础。在适配器中,我列出了记录。当用户单击任何记录时,列出了选项。这些选项是"发送"one_answers"删除"。删除选项从列表中删除记录,然后将选项发送记录发送到服务器。按下发送时,启动异步。对于删除操作,我在对话框中使用处理程序。(是或否)。

我的问题是,如果我在发送其他记录时按一个记录中的删除,申请崩溃,我得到了此删除;

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();
            }

我的asyntask非常典型。

我的问题是为什么我会得到这个例外"索引0,尺寸0"?这种尺寸不是myArraylist尺寸。

我该如何修复此代码,这种大小的来源是什么?

同样,如果我在删除中使用asynctask代替处理程序,我会得到"无法创建未称为looper.prepare()]的内部线程中的处理程序"。因此,我不能将Asyntack放在对话框中。

只需检查位置位于范围内,如果这样删除并进行更改如下:

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

绝对会帮助您

我在做什么,如何和我所拥有的东西几乎与您相同!这可能会有所帮助:

我在使用ListView的自定义适配器时获得了相同的例外。并从Android标准库课中抛出了例外,甚至没有导致我的代码的任何行。我还添加了标头,所以我的适配器被HeaderviewListAdapter隐式包裹。就我而言,当我从适配器中删除数据时出现问题。

我认为问题是因为ListView或适配器无法与Header一起使用,但实际上是其他原因。

我的解决方案是确保适配器的数据从未从其他线程更改,并且notifyDataSetChanged()从UI线程调用。

因此,修复了所有内容后,我的代码看起来像:

// Loader's callbacks
@Override
public Loader<...> onCreateLoader(int id, Bundle args) {
    return new Loader...
}
@Override
public void onLoadFinished(Loader<...> loader, Data data) {
    ...
    // adapter's list of items
    listItems.clear();
    listItems.addAll(data);
    adapter.notifyDataSetChanged();
    ...
}
@Override
public void onLoaderReset(Loader<List<? extends Map<String, ?>>> loader) {
    ...
}
// custom loader 
private static class ContactAsyncLoader extends AsyncTaskLoader<...> {
    @Override
    public List<..> loadInBackground() {
        Data data = new ..
        ...
        return data;
    }
}

最新更新