好的,所以我知道为什么会这样:cv.add(curid,temp);之后添加对temp,temp的内容更改的引用,导致所有条目都相同,因为它们都链接到temp。我查找了解决方案,但我无法得到适合我情况的解决方案,请参阅下文:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
Context context = getApplicationContext();
Resources res = context.getResources();
XmlResourceParser xpp = res.getXml(R.xml.thedata);
ArrayList<ArrayList<String>> cv = new ArrayList<ArrayList<String>>();
//Helper stuff
int curid = 0;
ArrayList<String> temp = new ArrayList<String>();
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if(xpp.getName().equalsIgnoreCase("id")){
curid = Integer.parseInt(xpp.nextText());
}
if(xpp.getName().equalsIgnoreCase("room") == false && xpp.getName().equalsIgnoreCase("id") == false && xpp.getName().equalsIgnoreCase("data") == false){
temp.add(xpp.getName() + "<>" + xpp.nextText());
}
}
else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("room")){
cv.add(curid, temp);
temp.clear();
}
eventType = xpp.next(); //move to next element
//Restart Loop
}
我需要首先在循环中填充ArrayList temp,这使我找到的解决方案不适用。
答案 0 :(得分:2)
我认为你应该使用Map
。 Map
是一个包含键和值的数据结构,第一个元素是键,第二个元素是值:
Map<key,value> myMap = new HashMap<key,value>();
因此您可以通过了解它们的关键字轻松找到该值。在这个数据结构中你不浪费内存,但是如果curid是2,你的例子的arraylist,下一个是10,你必须在3,4,5,6,7,8的所有arraylist索引中放入null, 9。这让你跟踪它们并引用它们很困难。(我假设这个,因为我认为你想要调用类似cv [curId] [0]的东西,你必须确保在index [curId]你有一个值而且它不是null,这使得创建错误的可能性非常大)所以让我们尝试通过这个新问题来解决你的问题:
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
Context context = getApplicationContext();
Resources res = context.getResources();
XmlResourceParser xpp = res.getXml(R.xml.thedata);
Map<int,ArrayList<string>> cv = new HashMap<int,ArrayList<string>>();
//Helper stuff
int curid = 0;
ArrayList<String> temp = new ArrayList<String>();
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if(xpp.getName().equalsIgnoreCase("id")){
curid = Integer.parseInt(xpp.nextText());
}
if(xpp.getName().equalsIgnoreCase("room") == false && xpp.getName().equalsIgnoreCase("id") == false && xpp.getName().equalsIgnoreCase("data") == false){
temp.add(xpp.getName() + "<>" + xpp.nextText());
}
}
else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("room")){
cv.put(curid,temp);
temp = new ArrayList<String>();
}
eventType = xpp.next(); //move to next element
//Restart Loop
}
现在例如你想访问curId = 10
的ArrayListArrayList<String> element = (ArrayList<String>) cv.get(10);
更多示例请看:
答案 1 :(得分:0)
为什么不将所有“Helper stuff”移动到辅助方法中?
public ArrayList<String> helperMethod(XmlResourceParser xpp, MutableInt id) {
int curid = 0;
ArrayList<String> temp = new ArrayList<String>();
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if(xpp.getName().equalsIgnoreCase("id")){
curid = Integer.parseInt(xpp.nextText());
}
if(xpp.getName().equalsIgnoreCase("room") == false && xpp.getName().equalsIgnoreCase("id") == false && xpp.getName().equalsIgnoreCase("data") == false){
temp.add(xpp.getName() + "<>" + xpp.nextText());
}
}
else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("room")){
id.setValue(curid);
break;
}
eventType = xpp.next(); //move to next element
//Restart Loop
}
return temp;
}
然后您可以将其称为
ArrayList<String> tempList;
MutableInt id = new MutableInt(0);
while((tempList = helperMethod(xpp, id)) != null) {
cv.add(id, tempList);
}