Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java.lang.IllegalStateException:适配器的内容已更改,但ListView。。。。尽管调用notifydatasetchanged()_Android_Android Asynctask_Listactivity - Fatal编程技术网

Android java.lang.IllegalStateException:适配器的内容已更改,但ListView。。。。尽管调用notifydatasetchanged()

Android java.lang.IllegalStateException:适配器的内容已更改,但ListView。。。。尽管调用notifydatasetchanged(),android,android-asynctask,listactivity,Android,Android Asynctask,Listactivity,通过后台线程(异步任务)更新listactivty的内容需要遵循哪些最佳实践 1) 我正在调用notifyDataSetChanged()来更新适配器,只要我操作适配器的内容,但当用户滚动或单击列表时,我的应用程序强制关闭。任何防止这种情况的指针都会非常有用 日志: java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知 2) 我应该在哪里更新listactivity的内容?在doInBackground()或onProgressUpda

通过后台线程(异步任务)更新listactivty的内容需要遵循哪些最佳实践

1) 我正在调用notifyDataSetChanged()来更新适配器,只要我操作适配器的内容,但当用户滚动或单击列表时,我的应用程序强制关闭。任何防止这种情况的指针都会非常有用

日志: java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知

2) 我应该在哪里更新listactivity的内容?在doInBackground()或onProgressUpdate()中

3) 当用户单击列表项时,我经常遇到崩溃。那么,在后台操作期间禁用listactivty上的click事件会解决问题吗?如果是这样,我不确定如何删除或设置项目,请单击listactivity的侦听器。也请告诉我这方面的情况

4) 我不认为在后台异步任务执行期间阻止所有ui交互是解决问题的唯一方法。我知道有一个简单的方法可以做到这一点,但需要一些帮助

提前谢谢

这是我的onCreate

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