Обновление списка после завершения асинхронной задачи - PullRequest
0 голосов
/ 18 февраля 2012

Как мне обновить listivew после выполнения асинхронной задачи. Ниже приведен пример кода, но список не обновляется.

    class CallXML extends AsyncTask<Void, Void, Void> {
    int gcid;
    int scid;

    public CallXML(int gid, int sid) {
        // TODO Auto-generated constructor stub
        gcid = gid;
        scid = sid;
    }

    protected void onPreExecute() {

    }

    protected Void doInBackground(Void... arg0) {
        // here goes the xml parsing....
        }   

        return null;            
    }

    protected void onPostExecute(String result) {  
       Log.e("TAG", "In postExecute");


       Cursor cur3 = database2.query("Quote", qfield,  null, null, null, null, null);
       cur3.moveToFirst();

       do {
        quotesarray.add(cur3.getString(2));

       }  while (cur3.moveToNext());

        if(cur3 != null){
            cur3.close();
        }

        QList.post(new Runnable() {
             public void run() {
                mAdapter = new CustomAdapter();
                mAdapter.notifyDataSetChanged();
                QList.setAdapter(mAdapter);    
             }
         });


        if (helper2 != null) {
            helper2.close();
        }

        if (database2 != null) {
            database2.close();
        } 

    }
}

EDIT:

На самом деле onPostExecute не выполняется, почему .. Так я называю asynctask new CallXML(gcid, scid).execute();

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

Кроме того, onPostExecute находится в главном потоке, поэтому не следует выполнять там запросы к базе данных.Вместо этого получите данные в doInBackground и верните оттуда итоговую коллекцию.

onPostExecute можно использовать для обновлений пользовательского интерфейса и обновления вашего адаптера с помощью коллекции результатов.

Редактировать: опубликовать исполняемый файл

 QList.post(new Runnable() {
                 public void run() {
                    //mAdapter.notifyDataSetChanged();
                    QList.setAdapter(mAdapter);    
                 }
             });

не требуется, поскольку вы находитесь в основном цикле.

2 голосов
/ 18 февраля 2012

Вы не предоставляете строковые элементы адаптеру в своем коде.И вам не нужно вызывать notifyDataSetChanged при установке адаптера в список, потому что когда вы устанавливаете адаптер, он автоматически загружает данные в список.Возможно, вы попытаетесь сделать это следующим образом:

protected void onPostExecute(String result) {  
       Log.e("TAG", "In postExecute");

       Cursor cur3 = database2.query("Quote", qfield,  null, null, null, null, null);
       cur3.moveToFirst();

       mAdapter = new CustomAdapter();

       do {
        mAdapter.add(cur3.getString(2));

       }  while (cur3.moveToNext());

        if(cur3 != null){
            cur3.close();
        }

        QList.post(new Runnable() {
             public void run() {
                //mAdapter.notifyDataSetChanged();
                QList.setAdapter(mAdapter);    
             }
         });


        if (helper2 != null) {
            helper2.close();
        }

        if (database2 != null) {
            database2.close();
        } 

    }
0 голосов
/ 18 февраля 2012

У тебя есть ошибка?если так, пожалуйста, отправьте это.Если нет Проверьте размер данных, полученных из базы данных, и если вы хотите обновить просмотр списка, просто вызовите listview.invalidateViews (), он обновит представление списка и установит новые данные в просмотре списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...