Как динамически добавлять элементы в просмотр списка - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь создать приложение для Android в Android Studio, которое позволяет мне добавлять элементы в мой listView во время выполнения.У меня был код, используемый для добавления предопределенных элементов, который работал, но когда я изменял его, добавляя один элемент каждый раз, когда я нажимаю кнопку добавления, мне удается добавить первый, но когда я пытаюсь добавить еще, все остальные элементы становятсякак первыйв editText widget, а затем создайте элемент с этими значениями, нажав кнопку Добавить.Когда я использую его, первый заканчивается следующим образом:

778216562   12

, но когда я добавляю еще один, все предыдущие элементы превращаются в новый:

589095564   15
589095564   15

Thisкод, используемый для добавления элементов в мой список.Метод addItem() вызывается, когда я нажимаю кнопку добавления в приложении, также listItem объявляется так List<HashMap<String, String>> listItems = new ArrayList<>();:

 public void addItem(){
        if(amountText.getText().toString().matches("[0-9]+")) {
            productList.put(idText.getText().toString(), amountText.getText().toString());


            SimpleAdapter adapter = new SimpleAdapter(this, listItems, R.layout.list_item,
                    new String[]{"idForID", "idForAmount"},
                    new int[]{R.id.productId, R.id.amount});

            resultsMap.put("idForID", idText.getText().toString());
            resultsMap.put("idForAmount", productList.get(idText.getText().toString()));
            listItems.add(resultsMap);

            productsView.setAdapter(adapter);

        }
    }

Кто-нибудь знает, как изменить этот код, чтобы я мог сохранитьдобавление элементов без изменения предыдущего, и пока я не могу добавить элемент с тем же идентификатором продукта, что и предыдущий, но с другим количеством, и задаетесь вопросом, знает ли кто-нибудь, как это решить?

1 Ответ

1 голос
/ 06 марта 2019

Ваша первая проблема связана с тем, как Java обрабатывает изменяемые типы данных. Поскольку resultsMap является глобальной переменной, когда вы вызываете put() с тем же значением ключа (т.е. "idForID" и "idForAmount"), вы переопределяете последний ввод для этих клавиш. Ссылка listItems все еще указывает на объект resultsMap, который теперь содержит переопределенные данные, оставляя вам несколько копий одного и того же объекта.

Простым решением этой проблемы было бы перемещение объявления объекта resultsMap внутри вашей функции addItem() (делая его локальной переменной). Хотя я бы также посоветовал против этого решения, учитывая ненужную дополнительную сложность Map, вложенного внутрь List.

Вместо этого, решение, которое также решило бы вашу вторую проблему, заключалось бы в создании класса для хранения данных.

final class Product(String id, String amount) {

    public final String id;
    public final String amount;

    public Product(String id, String amount) {
        this.id = id;
        this.amount = amount;
    }

    /**
     * Override equals() and hashCode() as well.
     * These can be generated in Android Studio by selecting 
     * Code > Generate… > equals() and hashCode().
     */

}

Затем используйте этот объект в качестве типа для вашего списка и адаптера вместо Map<String, String> и убедитесь, что вы создаете новый объект каждый раз, когда добавляете элемент в список. Это позволит вам создать List, содержащий любое количество предметов, даже если они имеют одинаковые id.


Как предложил @Raza, я бы также рекомендовал переключиться с ListView на RecyclerView. Как указано в документации ArrayAdapter.

Примечание: Если вы планируете использовать адаптер массива с ListView, рассмотрите возможность использования RecyclerView. RecyclerView предлагает аналогичные функции с лучшей производительностью и большей гибкостью, чем ListView обеспечивает. См. Руководство Recycler View .

...