我正在尝试在Android Studio中创建一个Android应用程序,该应用程序允许我在运行时将项目添加到listView中。我有一个用于添加预定义项目的代码,该代码在以下情况下有效:但是当我修改它以每次按下添加按钮添加一个项目时,我设法添加第一个项目,但是当我尝试在此之后添加更多项目时,所有其他项目都变为与第一个相同。
每个项目都有一个产品ID和一个数量,当我的应用程序条形码扫描仪扫描产品时,其中设置idText
,然后我通过在{{1 }},然后按“添加”按钮使用这些值创建一个项目。当我使用它时,第一个会以如下形式结束:
amountText
但是当我添加另一项时,所有先前的项都变成了新项:
editText widget
这是用于向我的listView添加项目的代码。当我按下应用程序上的添加按钮时,将调用778216562 12
方法,并且589095564 15
589095564 15
也这样声明addItem()
:
listItem
有人知道如何更改此代码,因此我可以继续添加项目而不更改上一个项目,而在此同时,我不能添加具有与上一个项目相同的产品ID,但数量和数量不同的项目想知道是否有人也知道如何解决这个问题?
答案 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指南。