Android java.lang.IllegalStateException:适配器的内容已更改,但ListView。。。。尽管调用notifydatasetchanged()
通过后台线程(异步任务)更新listactivty的内容需要遵循哪些最佳实践 1) 我正在调用notifyDataSetChanged()来更新适配器,只要我操作适配器的内容,但当用户滚动或单击列表时,我的应用程序强制关闭。任何防止这种情况的指针都会非常有用 日志: java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知 2) 我应该在哪里更新listactivity的内容?在doInBackground()或onProgressUpdate()中 3) 当用户单击列表项时,我经常遇到崩溃。那么,在后台操作期间禁用listactivty上的click事件会解决问题吗?如果是这样,我不确定如何删除或设置项目,请单击listactivity的侦听器。也请告诉我这方面的情况 4) 我不认为在后台异步任务执行期间阻止所有ui交互是解决问题的唯一方法。我知道有一个简单的方法可以做到这一点,但需要一些帮助 提前谢谢 这是我的onCreateAndroid java.lang.IllegalStateException:适配器的内容已更改,但ListView。。。。尽管调用notifydatasetchanged(),android,android-asynctask,listactivity,Android,Android Asynctask,Listactivity,通过后台线程(异步任务)更新listactivty的内容需要遵循哪些最佳实践 1) 我正在调用notifyDataSetChanged()来更新适配器,只要我操作适配器的内容,但当用户滚动或单击列表时,我的应用程序强制关闭。任何防止这种情况的指针都会非常有用 日志: java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知 2) 我应该在哪里更新listactivity的内容?在doInBackground()或onProgressUpda
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fa);
tvStatus=(TextView) findViewById(R.id.tvStatus);
adapter = new SimpleAdapter(
this,
mostPopularList,
R.layout.list_item,
new String[] {"title","author","views","date"},
new int[] {R.id.textView1,R.id.textView2,R.id.textView4,R.id.textView3});
//populateList();
setListAdapter(adapter);
}
我的异步任务
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// code for adding new listactivty items
}
@Override
protected void onPostExecute(String networkStatus) {
adapter.notifyDataSetChanged();
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
2) 我应该在哪里更新listactivity的内容?在doInBackground()或onProgressUpdate()中
在onProgressUpdate()
内部或在onPostExecute()内部,因为更改doInBackground()
中的内容并调用异步任务调用
@Override
protected void onPostExecute(String networkStatus) {
adapter.notifyDataSetChanged();
}
3) 当用户单击列表项时,我经常遇到崩溃。那么,在后台操作期间禁用listactivty上的click事件会解决问题吗?如果是这样,我不确定如何删除或设置项目,请单击listactivity的侦听器。也请告诉我这方面的情况
这不是一个解决办法。您只需要在UI线程上更新数据集。(不加载内容,只需从旧内容更新到新内容)。比如说
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected List<String> doInBackground(String... params) {
List<String> items = loadUpdatedDataset(params);
return items;
}
@Override
protected void onPostExecute(List<String> loadedItems) {
updateAdapterDataset(loadedItems);
adapter.notifyDataSetChanged();
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
私有类LongOperation扩展了异步任务{
@凌驾
受保护列表doInBackground(字符串…参数){
列表项=LoadUpdateDataSet(参数);
退货项目;
}
@凌驾
受保护的void onPostExecute(列表loadedItems){
UpdateDapterDataSet(loadedItems);
adapter.notifyDataSetChanged();
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的void onProgressUpdate(void…值){
}
}
请在本课中查看。有一个使用AsyncTask和Listview的好例子
我相信代码中的问题是因为适配器正在更新ListView,此时用户在ListView中单击导致应用程序崩溃。此异常具有误导性-原因很多。 导致此崩溃的一个原因是ArrayList对象无法完全更改。 因此,当我删除项目时,我必须执行以下操作:
mList.clear();
mList.addAll(newDataList);
这为我修复了崩溃。这个问题困扰了我很长时间 当我在调用
适配器之前使用MotionEvent
单击listView
时,notifyDataSetChanged()
,它确实会导致非法状态异常
因此,我认为在更新
ListView
之前调用ListView.setEnable
(false)是很有用的 那么listView.postInvalidate()呢?请发布日志cat,以便更好地理解restI,我也这么认为。但是我的listactivty没有on-itemclick侦听器。有时我会遇到以下错误java.lang.IndexOutOfBoundsException:索引2无效,大小为0。我怀疑崩溃发生在scroll上:-(
mList.clear();
mList.addAll(newDataList);