如何将项目动态添加到列表视图

时间:2019-03-05 21:20:19

标签: java android android-listview android-arrayadapter listview-adapter

我正在尝试在Android Studio中创建一个Android应用程序,该应用程序允许我在运行时将项目添加到listView中。我有一个用于添加预定义项目的代码,该代码在以下情况下有效:但是当我修改它以每次按下添加按钮添加一个项目时,我设法添加第一个项目,但是当我尝试在此之后添加更多项目时,所有其他项目都变为与第一个相同。

每个项目都有一个产品ID和一个数量,当我的应用程序条形码扫描仪扫描产品时,其中设置idText,然后我通过在{{1 }},然后按“添加”按钮使用这些值创建一个项目。当我使用它时,第一个会以如下形式结束:

amountText

但是当我添加另一项时,所有先前的项都变成了新项:

editText widget

这是用于向我的listView添加项目的代码。当我按下应用程序上的添加按钮时,将调用778216562 12 方法,并且589095564 15 589095564 15 也这样声明addItem()

listItem

有人知道如何更改此代码,因此我可以继续添加项目而不更改上一个项目,而在此同时,我不能添加具有与上一个项目相同的产品ID,但数量和数量不同的项目想知道是否有人也知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的第一个问题是因为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指南。