简体   繁体   中英

Android Firebase Listview ---> Hashmap Fail

I am trying to retrieve the Restaurant Name data from Firebase and output them in individual lines on ListView. I created a sample of the data which only consists of numbers(strings).

Retrieving the data seems fine as I could output them line by line in console, but my Hashmap is saving everything into the same "node" or "field"

Can anyone help me understand what I did wrong?

@Override
        public void onDataChange(DataSnapshot Snapshot) {
            int x = 1;
            //Do some stuff once
            for (DataSnapshot RestNames : Snapshot.getChildren()) {
                name = RestNames.getValue().toString();
                //System.out.println(name);
                map.put(x, name);
                x=x+1;
            }
            System.out.println(map);
            Items.add(map);
            System.out.println(Items);
            listView.setAdapter(mgadapter);
        }

The Output in the console is as follows :

 {8=3456, 11=9, 9=34567, 5=3, 3=3, 4=4, 10=0, 1=1, 7=345, 6=34, 2=2}

Android emulator shows the same value for every single row.

I want to display each value on a separate row.

Thank you!

EDIT: SNIPPET OF JSON

{
 "Eat": {
  "Name": {
   "-Jy3yehAkgqhg4knlxx_": "1",
   "-Jy3yjQT2AxtZMqD2kov": "2",
   "-Jy3yk96Mo5MKOEEzviJ": "3",
   "-Jy3yksamL08R0BckxNZ": "4",
   "-Jy5JBJYZUTxZQtmdDmi": "3",
   "-Jy5JIXT_lDZrUOkF3T1": "34",
   "-Jy5JJ0oMqGrs2vfFge2": "345",
   "-Jy5JJTyET830PYOT3yA": "3456",
   "-Jy5JJu-jDGMDXncWDKf": "34567",
   "-Jy5JVejdsUtggM8vBoi": "0",
   "-Jy5JbwEoWrKAi6XIVQY": "9"
  }
 }
}

Since we're missing some code in your snippet, I completed it an ran it locally:

Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/32367022/Eat/Name");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        int x = 1;
        Map<Integer,Object> map = new HashMap<Integer, Object>();
        for (DataSnapshot child: snapshot.getChildren()) {
            String name = child.getValue().toString();
            System.out.println(name);
            map.put(x, name);
            x=x+1;
        }
        System.out.println(map);
    }
    @Override
    public void onCancelled(FirebaseError firebaseError) {
    }
});

This prints out the following for me:

1
2
3
4
3
34
345
3456
34567
0
9
{1=1, 2=2, 3=3, 4=4, 5=3, 6=34, 7=345, 8=3456, 9=34567, 10=0, 11=9}

The first lines show the output from inside the for loop. The last lines shows the HashMap .

I use the most basic of Java classes, and this behavior seems correct to me.

I expect that the System.out.println(name); inside the for loop will display the same output as above for you, because the Firebase SDK handles ordering there.

If the order in the loop is correct, either your map or your Items object changes the order. It is impossible to say without seeing the types of these.

But in general, the approach above is how you should troubleshoot this problem: isolate it to a single object/class and then either fix what's wrong with that class (if it's your code) or replace it with a class that works for your use-case (if it comes from a library).

Update: I created a minimal app that shows the numbers in the correct order in a list view in this Github repo .

在模拟器中运行的应用

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM