2010-12-08 38 views
0

Alors, voici le problème. J'écris une application qui interroge un web-service pour certaines données. Les données renvoyées sont un nombre arbitraire de chaînes.Comment imbriquer ListViews?

J'ai besoin d'afficher une liste de ces chaînes, ce qui est évidemment plus facile en imbriquant un ListView dans un autre ListView. Cela crée un ListView dont les lignes contiennent d'autres ListViews. Le problème que j'ai rencontré est que, quand je fais cela, les ListViews internes n'affichent que le premier élément dans le tableau de sauvegarde.

J'utilise un ListAdapter personnalisé qui étend BaseAdapter. À l'aide du débogueur Eclipse, j'ai pu déterminer que la méthode getView (int, View, viewGroup) pour chaque instance (une pour chaque ligne dans l'ListView d'imbrication) est toujours appelée trois fois, mais toujours avec le même argument int (c'est 0). Le nombre de fois que getView() pour un ListAdapter est appelé semble avoir peu à voir avec le nombre d'éléments que contient le tableau de sauvegarde.

J'ai créé une application de test assez simple qui illustre ce que je suis en train de faire.

Ceci est mon ListAdapter. Un autre ListAdapter, InnerListAdapter imbriqué est utilisé pour remplir les listes internes.

package org.my.tests; 

import java.util.List; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

public class NestedListAdapter extends BaseAdapter { 

    Context context; 
    List<List<String>> list; 

    public NestedListAdapter(Context context, List<List<String>> list) { 
    this.context = context; 
    this.list = list; 
    } 

    @Override 
    public int getCount() { 
    return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
    return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
    return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    ListView view = new ListView(context); 
    view.setAdapter(new InnerListAdapter(list.get(position))); 
    return view; 
    } 

    public class InnerListAdapter extends BaseAdapter { 

    List<String> list; 

    public InnerListAdapter(List<String> list) { 
     this.list = list; 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView view = new TextView(context); 
     view.setText(String.valueOf(position) + ' ' + list.get(position)); 
     return view; 
    } 
    } 
} 

Voici le code pour mon activité de classe:

package org.my.tests; 

import java.util.ArrayList; 
import java.util.List; 

import android.app.ListActivity; 
import android.os.Bundle; 

public class ListViewTest extends ListActivity { 

    private static final List<List<String>> lists = new ArrayList<List<String>>(3); 

    static { 
    List<String> list = new ArrayList<String>(2); 
    list.add("a"); 
    list.add("b"); 
    lists.add(list); 
    list = new ArrayList<String>(2); 
    list.add("c"); 
    list.add("d"); 
    lists.add(list); 
    list = new ArrayList<String>(2); 
    list.add("e"); 
    list.add("f"); 
    lists.add(list); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_view_test); 
    setListAdapter(new NestedListAdapter(this, lists)); 
    } 
} 

Le ListAdapter personnalisé utilisé dans l'application réelle est beaucoup plus complexe et utilise l'inflation de mise en page pour les listviews imbriquées. Le résultat est le même si.

Est-ce que quelqu'un a des idées sur la façon de résoudre ce problème pour montrer les deux éléments dans chacune des listes intérieures?

Répondre

1

pourquoi ne pas utiliser un ExpandableListActivity avec leur ExpandableListView et ExpandableListAdapter, si vous les utilisez, déjà obtenu les méthodes: getChild, getGroup et vous pouvez construire differents pour les parents et Voir Childs ...