2013-08-28 9 views
0

ce que j'ai est un AsyncTask, qui a commencé dès que listview atteint point bas sur un écran, et AsyncTask il ajoute de nouveaux éléments à la listview. Voici le code:Adaptateur ListView de AsyncTask

 

    @Override 
    protected void onPostExecute(final List records) { 
     super.onPostExecute(records); 
     ((ActivityHome)context).runOnUiThread(new Runnable() { 
      public void run() { 

       for (ItemDailyRecord p : records) { 
        adapter.add(p); 
       } 

       adapter.notifyDataSetChanged(); 
      } 
     }); 

    } 

 

@Override 
    protected List doInBackground(Void... voids) { 

     DbAdapterDailyRecord db = new DbAdapterDailyRecord(context); 
     List list = db.getRecordsFromTo(offset, count); 

     return list; 
    } 

est ici une méthode de l'adaptateur ListView:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(position == getCount() - 1 && hasMoreItems){ 
      HistoryLoaderTask t = new HistoryLoaderTask(position + 1, pageSize, getContext(),this); 
      t.execute(); 
      footer.setText("Loading . . ."); 
     } 

Et le message d'erreur est (si je fais défiler ListView trop vite :)

CAUSÉS par: android.view.ViewRootImpl $ CalledFromWrongThreadException: seul le thread d'origine qui a créé une hiérarchie de vues peut toucher ses vues.

des idées comment résoudre ce problème?

+1

L'appel 'runOnUiThread()' est inutile. –

+0

Afficher le code que vous utilisez dans doInBackground –

+0

mais si je le supprime, message d'erreur est également là :( – user1908375

Répondre

1

La méthode onPostExecute() est exécutée sur le thread d'interface utilisateur, vous devez donc être mise à jour à l'interface utilisateur directement dans cette méthode; pas besoin de générer un nouvel objet Runnable.

+0

mais même mettre à jour l'interface utilisateur directement, je tombe:... Seul le fil d'origine qui a créé une hiérarchie de vue peut toucher son point de vue – user1908375

+0

après mise à jour avec une méthode d'adaptateur ListView – user1908375

+0

Quel est le type de votre 'Adaptateur ListView'? –

0

Vous ne devriez pas exécuter votre tâche async de getView de votre adaptateur. Au lieu de cela, vous devriez essayer de le faire de votre activité/fragment où votre liste réside en utilisant getLastVisiblePosition() de ListView

Vous aimez cette --->

if(list.getLastVisiblePosition() == (dataSet.size() - 1)) { 
// last item displayed 
.... change the text off footer and execute async task 
} 

et dans la tâche async ajouter les données supplémentaires à dataset, puis appelez notifyDataSetChanged() sur l'adaptateur. `OnPostExecute()` s'exécute déjà dans le thread de l'interface utilisateur

Questions connexes