Java 如何向listview动态添加项

Java 如何向listview动态添加项,java,android,android-listview,android-arrayadapter,listview-adapter,Java,Android,Android Listview,Android Arrayadapter,Listview Adapter,我正在尝试在android studio中创建一个android应用程序,允许我在运行时将项目添加到我的listView中。我有一个用于添加预定义项的代码,但当我修改它以添加一个项时,每当我按下“添加”按钮时,我都会添加第一个项,但当我尝试在之后添加更多项时,所有其他项都与第一个项相同 每个项目都有一个产品id和一个数量,其中当我的应用程序barcodescanner扫描一个产品时,idText被设置,然后我通过在editText小部件中指定一个值来设置amountText,然后按下Add按钮来

我正在尝试在android studio中创建一个android应用程序,允许我在运行时将项目添加到我的listView中。我有一个用于添加预定义项的代码,但当我修改它以添加一个项时,每当我按下“添加”按钮时,我都会添加第一个项,但当我尝试在之后添加更多项时,所有其他项都与第一个项相同

每个项目都有一个产品id和一个数量,其中当我的应用程序barcodescanner扫描一个产品时,
idText
被设置,然后我通过在
editText小部件中指定一个值来设置
amountText
,然后按下Add按钮来创建一个具有这些值的项目。当我使用它时,第一个结果应该是这样的:

778216562   12
但当我添加另一个项目时,以前的所有项目都会变成新项目:

589095564   15
589095564   15
这是用于将项目添加到我的listView的代码。当我按下应用程序上的add按钮时,会调用
addItem()
方法,并且
listItem
声明如下
listItems=new ArrayList()


是否有人知道如何更改此代码,以便我可以在不更改前一个代码的情况下继续添加项目,同时,我无法添加与前一个产品id相同但数量不同的项目,是否有人知道如何解决此问题

您的第一个问题是因为Java处理可变数据类型的方式。由于
resultsMap
是一个全局变量,当您使用相同的键值调用
put()
(即
“idForID”
“idForAmount”
)时,您将覆盖这些键的最后一个输入。参考
listItems
仍然指向现在包含覆盖数据的
resultsMap
对象,给您留下了同一对象的多个副本

此问题的一个简单解决方案是将
resultsMap
对象的声明移动到
addItem()
函数中(使其成为局部变量)。尽管考虑到嵌套在
列表
中的
映射
不必要地增加了复杂性,我还是建议不要使用这种解决方案

相反,解决第二个问题的解决方案是创建一个类来包含数据

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
,并确保每次向列表中添加项目时都创建一个新对象。这将允许您创建一个包含任意数量项目的
列表
,即使它们具有相同的
id


正如@Raza所建议的,我还建议从
ListView
切换到
RecyclerView
。如文件中所述

<强>注:如果您考虑使用ListVIEW使用数组适配器,请考虑使用CurryReVIEW。提供类似的服务 比ListView具有更好的性能和更大的灵活性的功能 提供。请参阅指南


每次调用
addItem()
时,您似乎都在不断创建和设置新适配器。尝试将您的
SimpleAdapter
和您的
productsView.setAdapter
移动到您的
onCreate()
方法。为什么不使用RecycleService我已经尝试将SimpleAdapter和productsView.setAdapter移动到onCreate(),但同样的情况仍然发生。我以前没有听说过recyclerview,但我可以试着查找它。我按照建议做了,制作了一个产品类,并使用recyclerview而不是listView。现在它工作得很好!非常感谢您的帮助!
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().
     */

}