2016-06-28 2 views
0

У меня есть список, отображающий значения из веб-службы. Прекрасно, когда загружает список. Но когда я нажимаю на какой-либо элемент, чтобы открыть новый фрагмент (который показывает детали элемента) и вернуться к тому же списку, его элементы удваиваются каждый раз. Например, если у меня (в оригинале) всего 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 on on метод ответа ниже.

 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

Это происходит потому, что вы не очищаете массивList. Из-за этого каждый раз, когда вы создаете массив и адаптер, вы добавляете элементы в массив, у которого уже есть элементы.

Вот почему у вас есть 5, затем 10, затем 15 и так далее ..

Очистить массив перед добавлением новых элементов

arrayList.clear(); 

или программа другая стратегия, как:

  • Не заполняйте массив каждый раз, когда вы возвращаетесь к фрагменту.
  • Проверьте, существует ли элемент, прежде чем добавить его в массив.
Смежные вопросы