我创建了两个列表。第一个列表是某个类类型(Syncgroupset),第二个列表是字符串类型的arraylist。这个syncgroupset类包含类型列表的arraylist的getter和setter。

我将解析xml,并将解析的值复制到class(s​​yncgroupset)的列表类型。

请找到如下的xml。

<syncgroupsettings>
        <syncgroupset id = "sgMS" labelid = "lblMS" enabled = "YES" default = "OFF">
            <syncgroup syncgroupname = "VISITS"/>
            <syncgroup syncgroupname = "CUSTOMERS"/>
        </syncgroupset>

        <syncgroupset id = "sgAS" labelid = "lblAS" enabled = "YES" default = "ON">
            <syncgroup syncgroupname = "SALESDOCS"/>
            <syncgroup syncgroupname = "ANALYTICS"/>
        </syncgroupset>
    </syncgroupsettings>


请找到如下代码

public List<Syncgroupset> parse(XmlPullParser parser) {
        String id = "";
        String synlabelid="";
        String enabled = "";
        String default1 = "";
        String syngroupname = "";

        List<Syncgroupset> mysynset = new ArrayList<Syncgroupset>();

        try {
            int eventType = parser.getEventType();

            List<String> mysyname = new ArrayList<String>();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagname = parser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if(tagname.equalsIgnoreCase("labels"))
                        {
                            skip(parser);

                        }else
                        if (tagname.equalsIgnoreCase("syncgroupsettings")) {
                            // do nothing
                        }else
                        if (tagname.equalsIgnoreCase("syncgroupset")) {
                            syncgroupset = new Syncgroupset();
                            id = parser.getAttributeValue(ns,"id");
                            synlabelid = parser.getAttributeValue(ns,"labelid");
                            enabled = parser.getAttributeValue(ns,"enabled");
                            default1 = parser.getAttributeValue(ns,"default");
                            syncgroupset.setLabelid(synlabelid);
                            syncgroupset.setEnabled(enabled);
                            syncgroupset.setDefault(default1);
                            syncgroupset.setId(id);
                            mysynset.add(syncgroupset);
                        }else
                        if(tagname.equalsIgnoreCase("syncgroup"))
                        {
                            syngroupname = parser.getAttributeValue(ns,"syncgroupname");
                            mysyname.add(syngroupname);
                        }
                        break;

                    case XmlPullParser.TEXT:
                        break;

                    case XmlPullParser.END_TAG:
                        if (tagname.equals("syncgroupset")) {
                            mysynset.get(mysynset.size() - 1).setSyncgroup(mysyname);
                            mysyname.clear();
                        }
                        break;

                    default:
                        break;
                }
                eventType = parser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mysynset;
    }


当我遇到syncgroup标签时,我会将值复制到其他类型的字符串列表中。我不是仅在这里将syncgroup值添加到类型类的列表中。

当我遇到syncgroupsetting的结束标签时,只有我通过替换将string类型的列表添加到type类的列表中。

然后,我要清除字符串类型的列表。当我这样做时,它甚至会清除班级列表中的列表。您能否让我知道我做错了什么。

最佳答案

似乎Syncgroupset保留了使用setSyncgroup(list)传递给它的列表的浅表副本。这就是list.clear()也会影响Syncgroupset的原因。

更改此行:


mysynset.get(mysynset.size() - 1).setSyncgroup(mysyname);



对此:

mysynset.get(mysynset.size() - 1).setSyncgroup(new ArrayList<String>(mysyname));


这样,它将不会被mysyname传递给它,
但是复制了mysyname所有元素的全新列表,
然后mysyname.clear()绝对不会影响通过该setSyncgroup调用传递的列表。

10-06 14:44