2016-06-28 68 views
0

我有一個列表視圖,它顯示了來自web服務的值。它加載列表視圖時很好。但是當我點擊任何項目來打開一個新的片段(顯示該項目的細節)並返回到相同的列表視圖時,其項目每次都會翻倍。例如,如果我(總共)有5個項目。然後當我從片段中回來時,總數將是10,然後是15,依此類推。這意味着應用程序一次又一次地添加所有項目。我搜索瞭解決方案,並做了什麼是像adapter.notifyDataSetChanged()一般的解決方案,但它仍然得到重複。如果任何人都可以告訴我這個問題,我將不勝感激。整個列表視圖被複制

public class CustomListAdapter extends ArrayAdapter<Model> { 
 

 
    private Context mContext; 
 
    int resource; 
 
    private ArrayList<Model> mListData = new ArrayList<Model>(); 
 

 

 

 
    public CustomListAdapter(Context mContext, int resource, ArrayList<Model> mListData) { 
 
     super(mContext, resource, mListData); 
 
     this.resource = resource; 
 
     this.mContext = mContext; 
 
     this.mListData = mListData; 
 
    } 
 

 
    public void setListData(ArrayList<Model> mListData) { 
 
     this.mListData = mListData; 
 
     notifyDataSetChanged(); 
 
    } 
 

 
    @Override 
 
    public int getCount() { 
 
     return super.getCount(); 
 
    } 
 

 
    @Override 
 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
 
     View v = convertView; 
 
     final ViewHolder holder; 
 
     if (v == null) { 
 
      holder = new ViewHolder(); 
 

 
      LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
 

 
      v = inflater.inflate(resource, parent, false); 
 

 
      holder.custname = (TextView) v.findViewById(R.id.cust_name); 
 
      holder.date = (TextView) v.findViewById(R.id.date); 
 
      holder.staffname = (TextView) v.findViewById(R.id.staff_name); 
 
      holder.time = (TextView) v.findViewById(R.id.time); 
 
      holder.service = (TextView) v.findViewById(R.id.service); 
 
      holder.refid = (TextView) v.findViewById(R.id.refid); 
 

 

 
      v.setTag(holder); 
 
     } else { 
 
      holder = (ViewHolder) v.getTag(); 
 
     } 
 

 

 

 

 
     final Model item = mListData.get(position); 
 

 
     holder.custname.setText(item.getCustname()); 
 
     holder.date.setText(item.getDate()); 
 
     holder.staffname.setText(item.getStaffname()); 
 
     holder.time.setText(item.getTime()); 
 
     holder.service.setText(item.getService()); 
 
     holder.refid.setText(item.getRefid()); 
 

 

 
     return v; 
 
    } 
 

 
    class ViewHolder { 
 

 
     TextView custname, date, staffname, time, service, refid; 
 
    } 
 
}
public class ListFrag extends Fragment{ 
 

 
    private SwipeMenuListView listView; 
 
    private CustomListAdapter adapter; 
 
    private CShowProgress cShowProgress; 
 
    private SQLiteHandler db; 
 
    private String uid, bookingId; 
 
    private ArrayList<Model> arrayList = new ArrayList<>(); 
 
    private static final String BOOKED_LIST = "http://192.168.220.13/android/showbookinglist"; 
 

 
    @Nullable 
 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
 
     return inflater.inflate(R.layout.listfrag, container, false); 
 
    } 
 

 
    @Override 
 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
 
     super.onViewCreated(view, savedInstanceState); 
 

 
     listView = (SwipeMenuListView)view.findViewById(R.id.list); 
 
     db = new SQLiteHandler(getActivity()); 
 
     cShowProgress = CShowProgress.getInstance(); 
 

 
     
 

 

 
     fetchDetails(); 
 

 
     adapter = new CustomListAdapter(getActivity(), R.layout.listitem, arrayList); 
 
     listView.setAdapter(adapter); 
 

 

 
     
 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 
      @Override 
 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
 

 
       String a = arrayList.get(i).getCustname(); 
 
       String b = arrayList.get(i).getStaffname(); 
 
       String c = arrayList.get(i).getService(); 
 
       String d = arrayList.get(i).getDate(); 
 
       String e = arrayList.get(i).getTime(); 
 
       String f = arrayList.get(i).getRefid(); 
 
       String g = arrayList.get(i).getEmail(); 
 
       String h = arrayList.get(i).getServprice(); 
 
       String j = arrayList.get(i).getSpeclprice(); 
 
       String k = arrayList.get(i).getStatus(); 
 

 

 
       db.addDetails(a, b, c, d, e, f, g, h, j, k); 
 

 
       DetailsView details = new DetailsView(); 
 
       ((Bookings)getActivity()).replaceFragment(details); 
 
      } 
 
     }); 
 

 
     
 
    } 
 

 
    private void fetchDetails() { 
 

 
     cShowProgress.showProgress(getActivity()); 
 

 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, BOOKED_LIST, 
 
       new Response.Listener<String>() { 
 
        @Override 
 
        public void onResponse(String response) { 
 
         cShowProgress.hideProgress(); 
 

 
         try { 
 
          JSONArray jsonArray = new JSONArray(response); 
 
          for(int i=0; i<jsonArray.length(); i++){ 
 
           JSONObject obj = jsonArray.getJSONObject(i); 
 
           Model model = new Model(); 
 
           model.setCustname(obj.getString("customername")); 
 
           model.setDate(obj.getString("staffdate")); 
 
           model.setStaffname(obj.getString("staffname")+"(Staff)"); 
 
           model.setTime(obj.getString("stafftime")); 
 
           model.setService(obj.getString("servicename")); 
 
           model.setRefid(obj.getString("booking_referenceid")); 
 
           model.setEmail(obj.getString("customeremail")); 
 
           model.setServprice(obj.getString("serviceprice")); 
 
           model.setSpeclprice(obj.getString("specialprice")); 
 
           model.setStatus(obj.getString("status")); 
 
           model.setBookid(obj.getString("bookingid")); 
 

 
           arrayList.add(model); 
 
          } 
 

 
          adapter.notifyDataSetChanged(); 
 

 

 

 

 

 

 
         } catch (JSONException e) { 
 
          // JSON error 
 
          e.printStackTrace(); 
 
          Toast.makeText(getActivity(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
 
         } 
 
        } 
 
       }, new Response.ErrorListener() { 
 
      @Override 
 
      public void onErrorResponse(VolleyError error) { 
 
       Toast.makeText(getActivity(), "VolleyError" + error.toString(), Toast.LENGTH_LONG).show(); 
 
      } 
 
     }) { 
 
      @Override 
 
      protected Map<String, String> getParams() { 
 
       Map<String, String> params = new HashMap<String, String>(); 
 

 
       params.put("spaid", "145"); 
 
       return params; 
 
      } 
 

 
     }; 
 

 
     RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); 
 
     requestQueue.add(stringRequest); 
 
    } 
 

 
    
 

 
}

回答

2

嘗試改變它.. B'coz您添加在先前創建的列表中的元素。所以你必須將其清除。

private void fetchDetails() { 

if(arrayList!=null)arrayList.clear(); // this line 

     cShowProgress.showProgress(getActivity()); 
+0

清除數組列表是最好的解決方案。非常感謝@saurabh 此外,感謝你們所有人的回覆。 –

+0

正確..快樂編碼:) –

+0

我做了一切,以找出我有這個問題,你先生,令人驚歎 – rookieDeveloper

0

的事情是,當你回到該片段是重新創建onViewCreated被再次調用。從那裏你再次調用fetchDetails(),然後你將第二次添加整個列表到適配器。因此,您可以在fetchDetails()之前清除列表,或者只需要再次獲取它們即可。

0

改變你的try - catch塊的onResponse方法如下。

 try { 
        JSONArray jsonArray = new JSONArray(response); 

        arrayList = new ArrayList<>(); 

        for(int i=0; i<jsonArray.length(); i++) 
        { 
         JSONObject obj = jsonArray.getJSONObject(i); 
         Model model = new Model(); 
          model.setCustname(obj.getString("customername")); 
          model.setDate(obj.getString("staffdate")); 
          model.setStaffname(obj.getString("staffname")+"(Staff)"); 
          model.setTime(obj.getString("stafftime")); 
          model.setService(obj.getString("servicename")); 
          model.setRefid(obj.getString("booking_referenceid")); 
          model.setEmail(obj.getString("customeremail")); 
          model.setServprice(obj.getString("serviceprice")); 
          model.setSpeclprice(obj.getString("specialprice")); 
          model.setStatus(obj.getString("status")); 
          model.setBookid(obj.getString("bookingid")); 

          arrayList.add(model); 
         } 

         adapter.notifyDataSetChanged(); 
0

發生這種情況是因爲您沒有清除arrayList。由於每次構建數組和適配器時都會將這些元素添加到已具有元素的數組中。

這就是爲什麼你有5個,10個,然後用15等..

清除數組添加新元素

arrayList.clear(); 

或程序之前,另一種策略,如:

  • 每次返回片段時都不要填充數組。
  • 檢查他的元素是否添加到數組之前。