2016-06-28 15 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

arraylistをクリアすることが最適な解決方法です。ありがとうございます@Saurabh また、あなたのお返事いただきありがとうございます。 –

+0

正しい..幸せコーディング:) –

+0

私はこの問題を抱えていることを知るためにすべてをやったよ、あなたよ、驚き – rookieDeveloper

0

事は、あなたが戻っフラグメントに取得するとき、それは再作成され、が再び呼び出されonViewCreatedということです。そこからもう一度fetchDetails()を呼び出し、もう一度全体リストをアダプタに追加します。だから、fetchDetails()の前にリストをクリアするか、もう一度フェッチする必要があるだけです。

0

下記のようにonResponseメソッドのtry-catchブロックを変更してください。

 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を消去していないために発生しています。このため、配列とアダプタを作成するたびに、すでに要素がある配列に要素を追加します。その後、15というように、あなたは5を持っている理由です

、10、...

クリアなどの新要素

arrayList.clear(); 

またはプログラム別の戦略追加する前に、アレイ:

  • をフラグメントに戻るたびに、配列に値を設定しないでください。
  • 要素が配列に追加される前に存在するかどうかを確認します。
関連する問題