3 votes

Android - PullToRefresh ListView toujours vide

Je suis en train d'implémenter Android-PullToRefresh de chrisbanes dans mon application. Mais pour le moment, tout ce que j'obtiens est une vue vide. Si je change le ListView pour un widget Android, ça fonctionne bien, mais si j'utilise PullToRefreshListView, la liste s'affiche vide. J'utilise un ListAdapter personnalisé.

Voici la partie XML :

Voici le code dans l'activité (il est appelé, du moins selon les informations de débogage) :

private void constroiLista(ArrayList lista)
{
    PullToRefreshListView lv = (PullToRefreshListView)findViewById(R.id.listview_jogos);
    if(lv != null && lista != null)
    {
        lv.setAdapter(new ListAdapter(this, lista));
        lv.setOnRefreshListener(new OnRefreshListener()
        {
            @Override
            public void onRefresh(PullToRefreshBase refreshView)
            {
                (dnt = new DownloadJogosTask()).execute();
            }
        });
        // Appeler onRefreshComplete lorsque la liste a été rafraîchie.
        lv.onRefreshComplete();
    }
}

Et si cela fait une différence, la mise en page contenant ce listview est gonflée dans une base :

((LinearLayout)findViewById(R.id.ll_base_layout)).addView(View.inflate(this, R.layout.lista_jogos, null));

Y a-t-il des bugs connus associés à cette bibliothèque ? J'ai cherché mais je n'ai rien trouvé de similaire. Merci d'avance pour votre aide :)

4voto

Marco Batista Points 1344

Après avoir essayé ce qui a été suggéré par Tarek, j'ai remarqué que la hauteur de PullToRefreshListView était toujours de 0.

Si j'utilise setContentView pour définir la mise en page au lieu de l'inflater dans un autre.. cela fonctionne ou si je définis une hauteur fixe new LayoutParams(LayoutParams.MATCH_PARENT, 1000)

Après avoir bidouillé, j'ai fini par ajouter ce bloc de code dans ma méthode customOnCreate pour que ça fonctionne:

((LinearLayout)findViewById(R.id.ll_base_layout)).addView(View.inflate(this, R.layout.lista_jogos, null));
LinearLayout ll = (LinearLayout)findViewById(R.id.ll_jogos);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)ll.getLayoutParams();
params.weight = 1;
ll.setLayoutParams(params);

Merci pour votre aide :)

3voto

Tarek K. Ajaj Points 841

Je suppose que votre (dnt = new DownloadJogosTask()).execute() va télécharger des Jogos et les ajouter à lista.

Si c'est votre scénario, essayez ce qui suit :

ListAdapter la = null; //rendez votre ListAdapter global dans votre activité
PullToRefreshListView lv = null; //pareil pour la liste

private void constroiLista(ArrayList lista) {

    lv = (PullToRefreshListView) findViewById(R.id.listview_jogos);
    la = new ListAdapter(this, lista); //initialise l'adaptateur de liste
    lv.setAdapter(la);

    lv.setOnRefreshListener(new OnRefreshListener() {
        @Override
        public void onRefresh(PullToRefreshBase refreshView) {
            if (lv != null && lista != null) { //si null, n'exécutez pas la tâche
                (dnt = new DownloadJogosTask()).execute();
            }
        }
    });
    // ce n'est pas ici que la liste est rafraîchie, donc supprimez cette ligne

}

dans le onPostExecute de DownloadJogosTask, vous appelez la.notifyDataSetChanged(); pour informer l'adaptateur que de nouvelles valeurs ont été ajoutées à votre lista puis appelez lv.onRefreshComplete(); qui masque simplement l'animation de chargement.

@Override
protected void onPostExecute(Void result) {
    super.onPostExecute(result);
    la.notifyDataSetChanged();
    lv.onRefreshComplete();
}

j'espère que cela vous aidera.

2voto

yuki tamazawa Points 21

Remplacez match_parent par wrap_content dans PullToRefreshListView

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X