【问题标题】:How to prevent listArray from populating multiple times?如何防止 listArray 多次填充?
【发布时间】:2018-01-29 10:10:15
【问题描述】:

我有一个通过 API 调用填充的微调器。 在第一次加载片段时,列表被正确填充,不同的项目,一个用于行。 提交后(我需要在此片段中提交)列表会重新填充几次。

这是 onCreate 方法:

@Override
    public void onCreate(Bundle savedInstanceState) {

        mItemSubscriptionList = new ArrayList<>();

        super.onCreate(savedInstanceState);
    }

这是填充数组列表的方法

private void loadItemSubscription() {

        ApiMapper mapper = new ApiMapper();
        mapper.getBalance(new ApiMapper.VolleyCallback<JSONArray>() {
            @Override
            public void onSuccess(JSONArray balance) {

               if (balance != null) {

                   Log.d(LOGTAG , balance.toString());

                   mItemSubscriptionList.clear();

                   for (int i = 0; i < balance.length(); i++) {

                       Log.d(LOGTAG , "Popolo lo spinner "+i);
                       try {

                           JSONObject obj = balance.getJSONObject(i);

                           String quantity = obj.getString("balance");

                           quantity = quantity.replace(".00","");

                               int id_item = obj.getInt("id_item");
                               String item = obj.getString("item");

                                item = item + ' '+'('+quantity+')';

                               Log.d(LOGTAG , quantity);
                               Log.d(LOGTAG , item);

                               ModelItemSubscription modelItemSubscription = new ModelItemSubscription();

                               modelItemSubscription.setMItemId(id_item);
                               modelItemSubscription.setMItemName(item);
                               modelItemSubscription.setMItemQuantity(quantity);

                               mItemSubscriptionList.add(modelItemSubscription);

                               mBaseApp.setItemSubscription(modelItemSubscription);


                           mLoadingDialog.dismiss();


                       } catch (JSONException e) {

                           e.printStackTrace();

                       }

                   }



                }

                mItemSubscriptionList = mBaseApp.getItemSubscription();

                if ( mItemSubscriptionList!=null ) {

                    renderSpinnerItemSubscription(mItemSubscriptionList);

                }

            }
        }, mToken, mIdMemberCard, mIdCampaign);

    }

在实际场景中,我有 4 个要填充的项目。 Log “Popolo lo spinner” 正好打印了 4 次,但这是丑陋的最终结果。

这是第一次加载后的正确行为(类型只有一项)

仅供参考,这是填充的数组:

[{"balance":"0.00","item":"Lampada","id_item":"540"},{"balance":"0.00","item":"Taglio","id_item" :"541"},{"balance":"1.00","item":"Piega","id_item":"542"},{"balance":"11.00","item":"Gelati"," id_item":"543"}]

非常感谢

【问题讨论】:

  • 你试过下面的答案吗

标签: android listview


【解决方案1】:

您的代码的问题是每次进行 API 调用时都会填充列表。表示如果调用 4 次,那么您的列表将使用相同的数据填充 4 次。

mItemSubscriptionList.add(modelItemSubscription); 不会覆盖,但无论项目是否已存在于列表中,它都会添加项目。

现在我建议您在调用 API 之前清除您的列表。只需在ApiMapper mapper = new ApiMapper(); 之后添加mItemSubscriptionList.clear()

【讨论】:

  • 嗨,我确实尝试过,但我得到了相同的行为。
【解决方案2】:

我看不到您在哪里填充 Spinner 适配器,所以我将描述如何在没有代码的情况下完成。

首先,每次从API 获取数据时,您应该清除保存数据的主ArrayList 并更新Spinner 的适配器:

adapter.notifySetDataChanged(); // Depending on the adapter

然后用新获取的数据填充您的ArrayList 并调用

adapter.notifySetDataChanged(); 再次刷新您的数据。

试试这个,看看它是否有效。如果没有,请添加更多代码,以便我们在获取数据后查看您是如何填充适配器的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2020-01-20
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多