2013-11-21 57 views
0

我有一个适配器,它是一个嵌套类:的ListView IllegalStateException异常 - 基于适配器

protected abstract class MyAdapter extends BaseAdapter { 

    private Context context; 
    private Data[] data; 

    protected MyAdapter(Context context) { 
     this.context = context; 
    } 

    public void setData(Data[] data) { 
     this.data = data; 
    } 

    @Override 
    public int getCount() { 
     return data == null || data.length == 0 ? 0 : data.length * 2; 
    } 

    @Override 
    public Object getItem(int i) { 
     return data == null ? null : data[i/2]; 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ... 
    } 
     ///other methods not modifying data[] 
} 

我使用使用setData(数据[]数据)只在一个地方:

public void setNewData(Data[] data) { 
    if (!Arrays.deepEquals(myAdapter.data, data)) { 
     myAdapter.setData(data); 
     myAdapter.notifyDataSetChanged(); 
    } 

    updateVisibility(); 
} 

并获得了变量在一个地方:

protected void updateVisibility() { 
    Data[] localData = myAdapter.data; 

    if (localData != null && localData.length > 0) { 
     //do smth not related to localData[] 
    } 
} 

在谷歌玩我看到的用户收到此错误:

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131427598, class android.widget.ListView) with Adapter] 
at android.widget.ListView.layoutChildren(ListView.java:1544) 
at android.widget.AbsListView.onTouchEvent(AbsListView.java:4141) 
at android.view.View.dispatchTouchEvent(View.java:7350) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2464) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197) 

但无法理解它来自哪里。

增加:

我认为这里的原因是:

在子类我重写getCount将()方法,并返回基于取向不同的数字。

@Override 
    public int getCount() { 
     int count = super.getCount(); 

     if (isPortrait(context.getResources())) { 
      count++; 
     } 

     return count; 
    } 

我认为我应该在这里更新listView的缓存项目数。 你觉得呢?我对吗?

+0

当你更新你的适配器添加一行'notifydatasetchanged(适配器);'它的发生,因为你的适配器中的数据已被修改,但没有通知 –

+0

你可以看到我设置数据后调用notifydatasetchanged() – TpoM6oH

回答

2

你确定你不使用data阵列来setNewData其他地方?也许你重复使用这个数组并以某种方式更新它?当内部listView的项目数量不等于适配器的getCount listview布局它的项目时,抛出此异常。重新检查你的代码。

+0

好评,它。你可以看看我的版本吗? – TpoM6oH

+0

是的。这可能是一个问题。如果适配器的数据被改变,你应该调用notifydatasetchanged。检查方向iside适配器是一个非常糟糕的主意。更好地创建适配器的2个版本并在方向更改时在它们之间进行交换。 – Leonidos

相关问题