私はそれが簡単な質問であることを知っていますが、
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);
ArrayListのArrayListからStringを取得したいのですが、その方法がわかりません。たとえば、私は行く
ArrayList<String> myList = collection.get(0);
String s = myList.get(0);
そしてそれは動作します!しかし:
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;
}
java.lang.IndexOutOfBoundsException:インデックス1が無効です。本当に存在するはずのアイテムをクリックすると、サイズが0になります。 ListViewを生成するコードは表示しませんでしたが、listOfSには3つの項目が含まれていることがわかります。1つ目はNull listOfZ、2つ目は2つの要素、3つ目のlistOfZは1つの要素です。
_listOfSomething.Clear();
listOfSomething.Add("first");
collection.Add(listOfSomething);
_
ここでリストをクリアして1つの要素(「最初」)を追加すると、listOfSomething
の最初の参照も更新されるため、両方が同じオブジェクトを参照するため、2番目の要素にアクセスするとmyList.get(1)
(もう存在しません)nullを取得します。
両方のcollection.Add(listOfSomething);
が同じarraylistオブジェクトへの2つの参照を保存していることに注意してください。
2つの要素に対して2つの異なるインスタンスを作成する必要があります。
_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);
_
リストをクリアした後、2番目の要素はnullであるためです。
つかいます:
String s = myList.get(0);
インデックス0が最初の要素であることを忘れないでください。
リスト内のリストを反復処理する正しい方法は次のとおりです。
//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);
}
}
リストを反復するよりクリーンな方法は次のとおりです。
// initialise the collection
collection = new ArrayList<ArrayList<String>>();
// iterate
for (ArrayList<String> innerList : collection) {
for (String string : innerList) {
// do stuff with string
}
}