Проблема с Arraylist и Hashmap, 35 раз выводит одну и ту же строку - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь заполнить свой ListView данными из моего файла JSON. но по какой-то причине он выводит только 35 раз одну и ту же строку в просмотр списка. Кто-нибудь знает почему?

JSONArray json = new JSONArray(data);
                ArrayList<HashMap<String, String>>  arrayList = new ArrayList<HashMap<String, String>>();

                HashMap<String, String> map = new HashMap<String, String>();
                try {
                for(int i=0;i<json.length();i++){
                    JSONObject e =json.getJSONObject(i);
                    map.put("id", String.valueOf(i));
                    map.put("Name", "Vorname: " + e.getString("meta_value"));
                    map.put("orderid", "id: " + e.getString("post_id"));
                    arrayList.add(map);
                }
final ArrayAdapter arrayAdapter = new ArrayAdapter(activity2.this, android.R.layout.simple_list_item_1,arrayList);

                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        ListView myListView = (ListView) findViewById(R.id.list);
                        myListView.setAdapter(arrayAdapter);
                    }
                });

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

В настоящее время вы присваиваете один и тот же объект каждому элементу массива.

Переместите создание карты в цикл for и используйте эту переменную области действия для выполнения манипуляции, а затем добавьте ее вмассив.

 try {
            for(int i=0;i<json.length();i++){
                HashMap<String, String> map = new HashMap<String, String>();
                JSONObject e =json.getJSONObject(i);
                map.put("id", String.valueOf(i));
                map.put("Name", "Vorname: " + e.getString("meta_value"));
                map.put("orderid", "id: " + e.getString("post_id"));
                arrayList.add(map);
            }
0 голосов
/ 16 октября 2019

Все переменные типа объекта в Java являются ссылочными переменными, и важно отличать установку ссылочной переменной (используя =) от манипулирования объектом, на который ссылается переменная (используя некоторый метод мутирования).

Здесь вы установили map для сохранения ссылки на ваш HashMap. Затем в цикле вы снова и снова добавляете одну и ту же ссылку, map, к arrayList. Когда вы приходите исследовать arrayList, в нем есть несколько копий map, но все они равны. Таким образом, вы будете просто снова и снова видеть то, что случается в HashMap в то время. Вы только когда-либо создали один HashMap;и каждый раз, когда вы помещаете свои "id", "Name" и "orderid" в свой HashMap, вы просто перезаписываете то, что было ранее.

Чтобы это исправить, вам нужно создать новый HashMapкаждый раз через цикл. Вам нужно объявить map перед циклом, но присвоить его внутри цикла, новому объекту каждый раз.

HashMap<String, String> map;
try {
    for(int i=0;i<json.length();i++){
        map = new HashMap<String, String>();
        e =json.getJSONObject(i);
        map.put("id", String.valueOf(i));
        map.put("Name", "Vorname: " + e.getString("meta_value"));
        map.put("orderid", "id: " + e.getString("post_id"));
        arrayList.add(map);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...