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

How to add items to listview dynamically

我正在尝试在 Android studio 中创建一个 android 应用程序,它允许我在运行时将项目添加到我的 listView。我有一个用于添加预定义项目的代码,但是当我修改它以在每次按下添加按钮时添加一个项目时,我设法添加了第一个但是当我尝试添加更多之后,所有其他项目都变成了和第一个一样。

每个项目都有一个产品 ID 和一个数量,其中 idText 在我的应用程序 barcodescanner 扫描产品时设置,然后我通过在 editText widget 然后通过按添加按钮创建一个具有这些值的项目。当我使用它时,第一个结果应该是这样的:

778216562   12

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

589095564   15
589095564   15

这是用于将项目添加到我的 listView 的代码。 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);

        }
    }

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

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

解决此问题的一个简单方法是将 resultsMap 对象的声明移到 addItem() 函数中(使其成为局部变量)。虽然我也建议反对这个解决方案,但考虑到 Map 嵌套在 List.

中不必要的增加的复杂性

相反,也可以解决您的第二个问题的解决方案是创建一个 class 来包含数据。

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 文档中所述。

Note: If you are considering using array adapter with a ListView, consider using RecyclerView instead. RecyclerView offers similar features with better performance and more flexibility than ListView provides. See the Recycler View guide.