2017-10-06 3 views
0

J'ai une application qui me rapporte les données de sqlite et les présente dans une liste listée dans un fragment, j'utilise une asynctask pour cela, quand je débogue il n'y a pas d'erreur, quand je lance l'application je bootListView n'est pas initialisé dans AsyncTask

erreur java.lang.NullPointerException: tentative d'invoquer la méthode virtuelle « vide android.widget.ListView.setAdapter (android.widget.ListAdapter) » sur une référence d'objet null.

Pourquoi cela se produit-il?

Fragment

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_frm_lst_cobertura, container, false); 
} 

AsyncTask

public class BckListCobertura extends AsyncTask<String, Fila_Lista_cobertura, String> { 
ActivityMenu activity; 
ListView listViewCobertura; 

public BckListCobertura(ActivityMenu activity) { 
    this.activity = activity; 
    this.delegate = activity; 
} 
@Override 
protected String doInBackground(String... params) { 
fila_lista_cobertura_adapter = new Fila_Lista_cobertura_adapter(activity, R.layout.row_lst_cobertura, colorlista); 
     listViewCobertura = (ListView) activity.findViewById(R.id.lstvCobertura); 
} 
@Override 
protected void onPostExecute(String result) { 
     listViewCobertura.setAdapter(fila_lista_cobertura_adapter); 
delegate.processFinishListCobertura(result); 
} 
+0

Vous ne pouvez pas faire la partie UI dans la méthode doInBackground. Vous devez trouver l'ID dans la méthode onCreateView et essayer. –

Répondre

2

Je crois que le problème est que vous initialisez le ListView, wh ich est un composant de l'interface utilisateur, dans un thread qui n'est pas le Thread UI.

Dans Android, tout ce qui concerne l'interface utilisateur doit être effectué dans le thread principal.

Il est conseillé d'initialiser chaque propre composant de Activity dans leur méthode onCreate(), ou, dans le cas où votre composant est dans un Fragment, dans sa méthode onCreateView().

Si vous voulez vraiment initialiser les éléments à l'intérieur de votre AsyncTask, vous pouvez remplacer la méthode onPreExecute() qui, selon le documentation, est exécutée dans le thread principal.

Pourtant, je ne sais pas combien de bonne pratique est-ce.

+0

Merci beaucoup pour votre réponse rapide, je suis nouveau à cette android, dites-moi comment je voudrais initialiser la liste sur l'oncreate et être en mesure d'ajouter les données à l'adaptateur de l'asynctask? –

+0

Et pourquoi, si cela fonctionne avec le débogage? –

+0

J'ai été capable de le résoudre, initialiser le listview dans le onPostExecute –