Je sais que c'est une question simple, mais
ArrayList<ArrayList<String>> collection;
ArrayList<String> listOfSomething;
collection= new ArrayList<ArrayList<String>>();
listOfSomething = new ArrayList<String>();
listOfSomething.Add("first");
listOfSomething.Add("second");
collection.Add(listOfSomething);
listOfSomething.Clear();
listOfSomething.Add("first");
collection.Add(listOfSomething);
Je veux prendre String dans ArrayList of ArrayList, et je ne sais pas comment faire. Par exemple je vais
ArrayList<String> myList = collection.get(0);
String s = myList.get(0);
et il fonctionne! mais:
private List<S> valuesS;
private List<Z> valuesZ;
ArrayList<ArrayList<String>> listOfS;
ArrayList<String> listOfZ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Zdatasource = new ZDataSource(this);
Zdatasource.open();
valuesZ = Zdatasource.getAllZ();
Sdatasource = new SDataSource(this);
Sdatasource.open();
valuesS = Sdatasource.getAllS();
List<Map<String, String>> groupData
= new ArrayList<Map<String, String>>();
List<List<Map<String, String>>> childData
= new ArrayList<List<Map<String, String>>>();
listOfS = new ArrayList<ArrayList<String>>();
listOfZ = new ArrayList<String>();
for (S i : valuesS) { // S is class
for (Z j : valuesZ) { // Z is class
if(j.getNumerS().equals(i.getNumerS())) {
listOfZ.add(j.getNumerZ());
}
else
{
//listOfZ.add("nothing");
}
}
listOfS.add(listOfZ);
if(!listOf.isEmpty()) listOfZ.clear();
}
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
int childPosition, long id) {
try
{
ArrayList<String> myList = listOfS.get(groupPosition);
String s = myList.get(childPosition);
PrintToast("group "+Integer.toString(groupPosition)+", child "+Integer.toString(childPosition) + " , "+ s);
}
catch(Exception e)
{
Log.e("FS", e.toString());
}
return true;
}
renvoyez-moi Java.lang.IndexOutOfBoundsException: index 1 invalide, la taille est 0 lorsque je clique sur l'élément qui devrait vraiment exister. Je n'ai pas montré de code qui génère ListView, mais je peux vous dire que mon listOfS contient 3 éléments: le premier est Null listOfZ, le second listOfZ a 2 éléments, le troisième listOfZ a 1 élément.
listOfSomething.Clear();
listOfSomething.Add("first");
collection.Add(listOfSomething);
Vous effacez la liste ici et ajoutez un élément ("premier"), la 1ère référence de listOfSomething
est également mise à jour et les deux référencent le même objet, donc lorsque vous accédez au deuxième élément myList.get(1)
(qui n'existe plus) vous obtenez le null.
Remarquez que collection.Add(listOfSomething);
enregistre deux références au même objet arraylist.
Vous devez créer deux instances différentes pour deux éléments:
ArrayList<ArrayList<String>> collection = new ArrayList<ArrayList<String>>();
ArrayList<String> listOfSomething1 = new ArrayList<String>();
listOfSomething1.Add("first");
listOfSomething1.Add("second");
ArrayList<String> listOfSomething2 = new ArrayList<String>();
listOfSomething2.Add("first");
collection.Add(listOfSomething1);
collection.Add(listOfSomething2);
Parce que le deuxième élément est nul après avoir effacé la liste.
Utilisation:
String s = myList.get(0);
Et rappelez-vous, l'index 0 est le premier élément.
La bonne façon d'itérer sur une liste à l'intérieur de la liste est:
//iterate on the general list
for(int i = 0 ; i < collection.size() ; i++) {
ArrayList<String> currentList = collection.get(i);
//now iterate on the current list
for (int j = 0; j < currentList.size(); j++) {
String s = currentList.get(1);
}
}
Une manière plus propre d'itérer les listes est:
// initialise the collection
collection = new ArrayList<ArrayList<String>>();
// iterate
for (ArrayList<String> innerList : collection) {
for (String string : innerList) {
// do stuff with string
}
}