如何防止listArray多次填充?

时间:2018-01-29 10:10:15

标签: android listview

我有一个从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次,但这是丑陋的最终结果。

enter image description here

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

enter image description here

Fyi这是填充的数组:

[{ “平衡”: “0.00”, “项目”: “Lampada”, “id_item”: “540”},{ “平衡”: “0.00”, “项目”: “塔格奥”, “id_item” : “541”},{ “平衡”: “1.00”, “项目”: “Piega”, “id_item”: “542”},{ “平衡”: “11.00”, “项目”: “格拉特”,” id_item “:” 543" }]

非常感谢

2 个答案:

答案 0 :(得分:0)

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

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

现在我建议您在调用API之前清除列表。只需在mItemSubscriptionList.clear()

之后添加ApiMapper mapper = new ApiMapper();即可

答案 1 :(得分:0)

我无法看到您填充Spinner适配器的位置,因此我将描述如何在没有代码的情况下完成此操作。

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

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

之后使用新获取的数据填充ArrayList并调用

adapter.notifySetDataChanged();  再次,以便您的数据得到刷新。

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