Search code examples
javaandroidandroid-listviewarraylistplist

Android get parsed data back to activity


I'm trying to parse a plist file, and as I see in log cat I'm doing that good, but when I try to return the arraylist that contains the objects I have parsed it gives me null(by this I mean that my object has an arraylist as parameter, and those arraylists are null). Can someone tell me where I'm going wrong?

Here is my parser:

public class XmlMapParser {

    private final static String CAT = "Category";
    private final static String TITLE_AR = "TitleAr";
    private final static String TITLE_FR = "TitleFr";
    private final static String TITLE_EN = "TitleEn";

    private final static String DESC_FR = "DescriptionFr";
    private final static String DESC_AR = "DescriptionAr";
    private final static String DESC_EN = "DescriptionEn";
    private final static String DESC_PH = "DescriptionPh";

    private XmlPullParser parser;
    private ArrayList<String> ar, en, ph, fr;
    private ArrayList<MyObjectFinal> parsedElements;
    private String category, titleAr, titleFr, titleEn;

    public XmlMapParser(Context context, int xmlid) {
        parser = context.getResources().getXml(xmlid);
        ar = new ArrayList<String>();
        fr = new ArrayList<String>();
        ph = new ArrayList<String>();
        en = new ArrayList<String>();
        parsedElements = new ArrayList<MyObjectFinal>();
    }

    public HashMap<String, ArrayList<String>> convert() {
        HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

        final String KEY = "key", STRING = "string";

        try {
            parser.next();
            int eventType = parser.getEventType();
            String lastTag = null;
            String lastKey = null;

            while (eventType != XmlPullParser.END_DOCUMENT) {

                if (eventType == XmlPullParser.START_TAG) {
                    lastTag = parser.getName();
                } else if (eventType == XmlPullParser.TEXT) {
                    // some text

                    if (KEY.equalsIgnoreCase(lastTag)) {
                        // start tracking a new key
                        lastKey = parser.getText();
                    } else if (STRING.equalsIgnoreCase(lastTag)) {
                        // a new string for the last encountered key
                        if (!map.containsKey(lastKey)) {
                            map.put(lastKey, new ArrayList<String>());
                        }
                        try {
                            if (lastKey.equals("Category")) {
                                category = parser.getText();
                                Log.v("--", "OBJECT DA " + ar.size());
                                parsedElements.add(new MyObjectFinal(category,
                                        titleEn, titleFr, titleAr, ar, en, fr,
                                        ph));
                                Log.v("--", "Adding cat:" + category + " tit:"
                                        + titleEn + " descEn" + en.size()
                                        + " desckAr:" + ar.size());
                                ar.clear();
                                en.clear();
                                ph.clear();
                                fr.clear();
                                category = null;
                                titleAr = null;
                                titleFr = null;
                                titleEn = null;
                            } else {
                                if (lastKey.equals(DESC_AR)) {
                                    ar.add(parser.getText());
                                }
                                if (lastKey.equals(DESC_FR))
                                    fr.add(parser.getText());
                                if (lastKey.equals(DESC_EN))
                                    en.add(parser.getText());
                                if (lastKey.equals(DESC_PH))
                                    ph.add(parser.getText());
                                if (lastKey.equals(CAT))
                                    category = parser.getText();
                                if (lastKey.equals(TITLE_EN))
                                    titleEn = parser.getText();
                                if (lastKey.equals(TITLE_FR))
                                    titleFr = parser.getText();
                                if (lastKey.equals(TITLE_AR))
                                    titleAr = parser.getText();
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        map.get(lastKey).add(parser.getText());
                    }
                }

                eventType = parser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return map;
    }

    public int parsedElementsSize() {
        return parsedElements.size();
    }

    public ArrayList<MyObjectFinal> getParsedElements() {
        return parsedElements;
    }

And I'm getting size 0 by doing this myXmlParser.getParsedElements().get(0).getDescriptionEn().size();


Solution

  • You are currently using only one instance of ArrayList for all your MyObjectFinal instances, as shown by the use of en.clear(); (also applies to the other array lists used in MyObjectFinal).

    That means that when you en.clear();, you clear the content of the ArrayList for all the instances of the MyObjectFinal.

    You need to create a new instance of ArrayList for each instance of MyObjectFinal, like so:

    en = new ArrayList<>();
    

    instead of

    en.clear();