Android, ListView IllegalStateException: “The content of the adapter has changed but ListView did not receive a notification”

后端 未结 25 2330
执念已碎
执念已碎 2020-11-22 16:59

What I want to do: run a background thread which calculates ListView contents and update ListView partially, while results are calculated.

W

25条回答
  •  攒了一身酷
    2020-11-22 17:53

    I faced a similar problem, here's how I solved in my case. I verify if the task already is RUNNING or FINISHED because an task can run only once. Below you will see a partial and adapted code from my solution.

    public class MyActivity... {
        private MyTask task;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
           // your code
           task = new MyTask();
           setList();
        }
    
        private void setList() {
        if (task != null)
            if (task.getStatus().equals(AsyncTask.Status.RUNNING)){
                task.cancel(true);
                task = new MyTask();
                task.execute();         
            } else if (task.getStatus().equals(AsyncTask.Status.FINISHED)) {
                task = new MyTask();
                task.execute();
            } else 
                task.execute();
        }
    
        class MyTask extends AsyncTask{
           List Itens;
    
           @Override
           protected void onPreExecute() {
    
            //your code
    
            list.setVisibility(View.GONE);
            adapterItem= new MyListAdapter(MyActivity.this, R.layout.item, new ArrayList());
            list.setAdapter(adapterItem);
    
            adapterItem.notifyDataSetChanged();
        }
    
        @Override
        protected Void doInBackground(Void... params) {
    
            Itens = getItens();
            for (Item item : Itens) {
                publishProgress(item );
            }
    
            return null;
        }
    
        @Override
        protected void onProgressUpdate(Item ... item ) {           
            adapterItem.add(item[0]);
        }
    
        @Override
        protected void onPostExecute(Void result) {
            //your code
            adapterItem.notifyDataSetChanged();     
            list.setVisibility(View.VISIBLE);
        }
    
    }
    
    }
    

提交回复
热议问题