【问题标题】:How to add items to listview dynamically如何动态地将项目添加到列表视图
【发布时间】:2019-03-05 21:20:19
【问题描述】:

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

每个项目都有一个产品 ID 和一个金额,其中 idText 在我的应用条码扫描器扫描产品时设置,然后我通过在 editText widget 中指定一个值来设置 amountText,然后创建一个通过按“添加”按钮,使用这些值的项目。当我使用它时,第一个最终应该是这样的:

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 相同但数量不同的项目,并且想知道是否有人也知道如何解决这个问题?

【问题讨论】:

  • 看起来您每次调用addItem() 时都会不断创建和设置新适配器。尝试将您的 SimpleAdapter 和您的 productsView.setAdapter 移动到您的 onCreate() 方法。
  • 为什么不用recyclerview
  • 我尝试将 SimpleAdapter 和 productsView.setAdapter 移动到 onCreate() 但同样的事情仍然发生。我以前没听说过recyclerview,但我可以试着查一下。

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


【解决方案1】:

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

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

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

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 指南。

【讨论】:

  • 我按照建议做了一个产品类并使用 RecyclerView 而不是 listView。现在它工作得很好!非常感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多