2016-01-30 23 views
2

構建一個選項卡式佈局,我有3個片段類,它們全部下載值爲JSON並填充爲RecyclerView片段加載重複值,可能的原因?

現在問題是:當我在一個片段,並切換到另一個並返回到上了年紀,我看到重複第一,說如果我有一個片段一個卡,當我回到回,我得到兩張相同的卡片(複製)。

下面是代碼:

public class ReceiptFragment extends Fragment 
{ 
    private static String URL_FEE; 
    private List<FeePojo> fee = new ArrayList<FeePojo>(); 
    private RecyclerView feeList; 
    CustomFeeAdapter feeAdapter; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.receipt, container, false); 

     feeAdapter = new CustomFeeAdapter(fee); 
     SharedPreferences pref = this.getActivity().getSharedPreferences("ActivitySession", Context.MODE_PRIVATE); 
     URL_FEE = " https://api.eduknow.info/mobile/fees/buttercup/"+pref.getString("MOB",""); 
     Log.w("CHECK::",""+URL_FEE); 
     feeList = (RecyclerView)rootView.findViewById(R.id.rv_fee); 
     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     feeList.setLayoutManager(llm); 
     feeList.setAdapter(feeAdapter); 


     JsonArrayRequest feeReq = new JsonArrayRequest(URL_FEE, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d("EDUKNOW::FEE", response.toString()); 
         //hidePDialog(); 

         SharedPreferences Tempx = getActivity().getSharedPreferences("ActivitySession", Context.MODE_PRIVATE); 
         SharedPreferences.Editor edx = Tempx.edit(); 
         edx.putString("GSON_FEE", response.toString()); 
         edx.apply(); 

         Gson gson = new Gson(); 
         JsonParser parser = new JsonParser(); 
         JsonArray jArray = parser.parse(Tempx.getString("GSON_FEE","")).getAsJsonArray(); 

         //ArrayList<MainPojo> uid = new ArrayList<MainPojo>(); 

         for(JsonElement obj : jArray) 
         { 
          FeePojo cse = gson.fromJson(obj , FeePojo.class); 
          fee.add(cse); 

         } 
         Log.w("EDUKNO::CHECK",""+fee.get(0).getSchoolName()); 
         feeAdapter.notifyDataSetChanged(); 

         // Parsing json 








        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) 
      { 
       SharedPreferences Tempx = getActivity().getSharedPreferences("ActivitySession", Context.MODE_PRIVATE); 

       Gson gson = new Gson(); 
       JsonParser parser = new JsonParser(); 
       JsonArray jArray = parser.parse(Tempx.getString("GSON_FEE","")).getAsJsonArray(); 

       //ArrayList<MainPojo> uid = new ArrayList<MainPojo>(); 

       for(JsonElement obj : jArray) 
       { 
        FeePojo cse = gson.fromJson(obj , FeePojo.class); 
        fee.add(cse); 
        feeAdapter.notifyDataSetChanged(); 
       } 

       VolleyLog.d("EDUKNOW::::", "Error: " + error.getMessage()); 
       //hidePDialog(); 


      } 
     }); 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(feeReq); 

     return rootView; 
    } 
} 

什麼可能是可能造成的?什麼是解決這個問題的最佳選擇?謝謝!

PS:沒有錯誤/警告在logcat的

+0

試着清除的ArrayList即費,當你添加數據 –

回答

1

什麼可能是可能會造成這個?最好的替代 是否解決了這個問題?

由於private List<FeePojo> fee = new ArrayList<FeePojo>();

線,因爲fee對象包含舊項目來從其他片段回來的時候。

無論是清楚fee切換到下一個片段時或fee ArrayList.Like增加新的項目之前調用清除所有數據:

fee.clear(); //<<<< 
for(JsonElement obj : jArray) 
    { 
     FeePojo cse = gson.fromJson(obj , FeePojo.class); 
     fee.add(cse); 

    } 

編輯:

最佳重新時,爲了避免發出呼叫ArrayList是數據,否則每次請求它發生在用戶從其他片段返回時發生:

if(fee.isEmpty()){ 
    AppController.getInstance().addToRequestQueue(feeReq); 
} 
+0

什麼是前從片段切換時清除列表的最佳方法是什麼?如果你可以用這個編輯答案,那對我很有幫助! :) – OBX

+0

@oblivion:看到我的答案簡單的方法是調用'fee.clear();'在列表中添加新項目 –

+0

Nopes!那不能解決它! :( – OBX

0

如果你改變你的初始化:

fee = new ArrayList<FeePojo>(); 

到onCreateView前

feeAdapter = new CustomFeeAdapter(fee); 

應該清除掉舊的列表會自動