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?