2017-03-25 3 views
1

J'ai essayé beaucoup de choses pour résoudre ce problème et chercher la solution pendant des heures, j'ai besoin d'aide avec ceci. J'ai un listview, en important des données de MySQL et en récupérant des données dans Listview. Mon problème: les éléments dupliqués listview (Seulement les 20 premiers, puis j'utilise "loadmoredata" et je reçois sur le défilement downn 20 nouveaux éléments, mais pas plus d'éléments en double à nouveau). Ainsi, la première fois que je vois 40 articles (20 répétés).Comment puis-je supprimer des éléments en double dans ArrayList <Object> avec LinkedHashSet?

J'ai essayé LinkedHashSet mais je ne peux pas obtenir cela fonctionne. Aucune suggestion?

private ArrayList<Usuarios> items; 
private Set<Usuarios> set; 
private ArrayList<Usuarios> newList; 
Activity activity; 
Usuarios_adapter adapter; 

... 

listView = (ListView) findViewById(R.id.listView); 
    listView.setOnItemClickListener(this); 

    activity=this; 
    items=new ArrayList<Usuarios>(); 
    set = new LinkedHashSet<Usuarios>(items); 
    newList = new ArrayList<Usuarios>(set); 
    adapter=new Usuarios_adapter(activity,newList); 
    listView.setAdapter(adapter); 

    //more code here 

    } 
    class BackTask extends AsyncTask<Void,Void,Void>{ 

    protected void onPreExecute(){ 
     super.onPreExecute(); 
     listView.addFooterView(footerView); 

    } 
    protected Void doInBackground(Void...params) { 
     HashMap<String,String> params2 = new HashMap<>(); 
     params2.put(Config.TAG_PESO,lastpeso2); 
     RequestHandler rh = new RequestHandler(); 
     String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2); 
     JSON_STRING = s; 
     JSONObject jsonObject = null; 
     try { 
      if(isLoadMore){ 
      isLoadMore = false; } 
      jsonObject = new JSONObject(JSON_STRING); 
      JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY); 

      for (int i = 0; i < result.length(); i++) { 
       JSONObject jo = result.getJSONObject(i); 
       String id = String.valueOf(jo.getInt(Config.TAG_ID)); 
       String nombre = jo.getString(Config.TAG_NOMBRE); 
       String email = jo.getString(Config.TAG_EMAIL); 
       String foto = jo.getString(Config.TAG_FOTO); 
       String peso = jo.getString(Config.TAG_PESO); 
       String vasos = jo.getString(Config.TAG_VASOS); 
       String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO); 
       String aplausos = jo.getString(Config.TAG_APLAUSOS); 
       String followers = jo.getString(Config.TAG_FOLLOWERS); 

       Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers); 
       //items.add(user); //this would be the original, who give me duplicated items 

       newList.add(user);//this is the second arraylist 

      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 


    protected void onPostExecute(Void result){ 
     listView.removeFooterView(footerView); 
     adapter.notifyDataSetChanged(); 




    } 
} 
    BackTask bt = new BackTask(); 
    bt.execute(); 

EDIT: Avec @Japu_D_Cret modification

private ArrayList<Usuarios> items; 
    private Activity activity; 
    private Usuarios_adapter adapter; 

    ..... 

    activity=this; 
    items=new ArrayList<Usuarios>(); 
    adapter=new Usuarios_adapter(activity,items); 
    listView.setAdapter(adapter); 

    .... 

    Set<Usuarios> set = new HashSet<>(items); 

      for (int i = 0; i < result.length(); i++) { 
       JSONObject jo = result.getJSONObject(i); 
       String id = String.valueOf(jo.getInt(Config.TAG_ID)); 
       String nombre = jo.getString(Config.TAG_NOMBRE); 
       String email = jo.getString(Config.TAG_EMAIL); 
       String foto = jo.getString(Config.TAG_FOTO); 
       String peso = jo.getString(Config.TAG_PESO); 
       String vasos = jo.getString(Config.TAG_VASOS); 
       String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO); 
       String aplausos = jo.getString(Config.TAG_APLAUSOS); 
       String followers = jo.getString(Config.TAG_FOLLOWERS); 

       Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers); 
       //items.add(user); 
       set.add(user); 


      } 
      //clear the list, so no duplicates occurr 
      items.clear(); 
      //copy the temporary set to the items 
      items.addAll(set); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
     } 
     return null; 
    } 

Et ceci est mon getView

 public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     LayoutInflater inflator = activity.getLayoutInflater(); 
     convertView = inflator.inflate(R.layout.b_server_list_item, null); 
     holder = new ViewHolder(); 
     holder.id = (TextView) convertView.findViewById(R.id.id); 
     holder.email = (TextView) convertView.findViewById(R.id.list_email); 
     holder.nombre = (TextView) convertView.findViewById(R.id.Nombre); 
     holder.peso = (TextView) convertView.findViewById(R.id.Peso); 
     holder.vasos = (TextView) convertView.findViewById(R.id.Vasos); 
     holder.seguimiento = (TextView) convertView.findViewById(R.id.Seguimiento); 
     holder.followers = (TextView) convertView.findViewById(R.id.tv_followers); 
     holder.aplausos = (TextView) convertView.findViewById(R.id.tv_aplausos); 
     holder.picture = (ImageView) convertView.findViewById(R.id.foto_profile); 
     holder.foto_id = (TextView) convertView.findViewById(R.id.foto_id); 
     holder.rank = (TextView) convertView.findViewById(R.id.Rank); 
     holder.picture = (ImageView) convertView.findViewById(R.id.foto_profile); 
     convertView.setTag(holder); 

    } else { 

     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.id.setText(items.get(position).getId()); 
    holder.email.setText(items.get(position).getEmail()); 
    holder.nombre.setText(items.get(position).getNombre()); 
    holder.peso.setText(items.get(position).getPeso()); 
    holder.vasos.setText(items.get(position).getVasos()); 
    holder.seguimiento.setText(items.get(position).getSeguimiento()); 
    holder.followers.setText(items.get(position).getFollowers()); 
    holder.aplausos.setText(items.get(position).getAplausos()); 
    holder.foto_id.setText(items.get(position).getFoto()); 
    final int pos = position+1; 
    holder.rank.setText("" + pos); 

    String fotoid = holder.foto_id.getText().toString(); 
    if(fotoid.contains("avatar_a")){holder.picture.setImageResource(R.drawable.avatar_a);} 
    if(fotoid.contains("avatar_b")){holder.picture.setImageResource(R.drawable.avatar_b);} 

    return convertView; 
} 
+0

vous n'utilisez pas l'ensemble. vous copiez le contenu dans newList, mais ne l'utilisez pas réellement. voir ma réponse ci-dessous –

+0

si votre question est répondue, s'il vous plaît marquer la réponse –

Répondre

2

dans ces lignes, vous devez d'abord créer un un des éléments ArrayList, puis copie c'est contenu dans un ensemble Set, puis copy le paramètre Définit le contenu dans une nouvelle ArrayList Liste

items=new ArrayList<Usuarios>(); 
set = new LinkedHashSet<Usuarios>(items); 
newList = new ArrayList<Usuarios>(set); 

je supprimerais toutes les listes inutiles et seulement aller avec le Set, donc votre code ressemblera à ceci

//private ArrayList<Usuarios> items; 
private Set<Usuarios> set; 
//private ArrayList<Usuarios> newList; 

//... 

protected Void doInBackground(Void...params) { 
    HashMap<String,String> params2 = new HashMap<>(); 
    params2.put(Config.TAG_PESO,lastpeso2); 
    RequestHandler rh = new RequestHandler(); 
    String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2); 
    JSON_STRING = s; 
    JSONObject jsonObject = null; 
    try { 
     if(isLoadMore){ 
     isLoadMore = false; } 
     jsonObject = new JSONObject(JSON_STRING); 
     JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY); 

     for (int i = 0; i < result.length(); i++) { 
      JSONObject jo = result.getJSONObject(i); 
      String id = String.valueOf(jo.getInt(Config.TAG_ID)); 
      String nombre = jo.getString(Config.TAG_NOMBRE); 
      String email = jo.getString(Config.TAG_EMAIL); 
      String foto = jo.getString(Config.TAG_FOTO); 
      String peso = jo.getString(Config.TAG_PESO); 
      String vasos = jo.getString(Config.TAG_VASOS); 
      String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO); 
      String aplausos = jo.getString(Config.TAG_APLAUSOS); 
      String followers = jo.getString(Config.TAG_FOLLOWERS); 

      Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers); 
      //items.add(user); //this would be the original, who give me duplicated items 

      //newList.add(user);//this is the second arraylist 

      set.add(user); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

après vos commentaires j'ai modifié, donc il utilise seulement un ensemble à l'intérieur du fonction:

private ArrayList<Usuarios> items; 
//private Set<Usuarios> set; 
//private ArrayList<Usuarios> newList; 

//... 

protected Void doInBackground(Void...params) { 
    HashMap<String,String> params2 = new HashMap<>(); 
    params2.put(Config.TAG_PESO,lastpeso2); 
    RequestHandler rh = new RequestHandler(); 
    String s = rh.sendPostRequest(Config.URL_GET_ALL3, params2); 
    JSON_STRING = s; 
    JSONObject jsonObject = null; 
    try { 
     if(isLoadMore){ 
     isLoadMore = false; } 
     jsonObject = new JSONObject(JSON_STRING); 
     JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY); 

     //make a temporary copy 
     Set<Usuarios> set = new HashSet<>(items); 

     for (int i = 0; i < result.length(); i++) { 
      JSONObject jo = result.getJSONObject(i); 
      String id = String.valueOf(jo.getInt(Config.TAG_ID)); 
      String nombre = jo.getString(Config.TAG_NOMBRE); 
      String email = jo.getString(Config.TAG_EMAIL); 
      String foto = jo.getString(Config.TAG_FOTO); 
      String peso = jo.getString(Config.TAG_PESO); 
      String vasos = jo.getString(Config.TAG_VASOS); 
      String seguimiento = jo.getString(Config.TAG_SEGUIMIENTO); 
      String aplausos = jo.getString(Config.TAG_APLAUSOS); 
      String followers = jo.getString(Config.TAG_FOLLOWERS); 

      Usuarios user = new Usuarios(id, nombre, email, foto, peso, vasos, seguimiento ,aplausos, followers); 
      //items.add(user); //this would be the original, who give me duplicated items 

      //newList.add(user);//this is the second arraylist 

      set.add(user); 
     } 

     //clear the list, so no duplicates occurr 
     list.clear(); 
     //copy the temporary set to the items 
     list.addAll(set); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
+0

J'ai essayé. Si je fais cela, je reçois 0 objets et plantage. J'ai besoin au moins de 'private ArrayList items' parce que je dois l'utiliser dans l'adaptateur' adapter = new Usuarios_adapter (activité, items); 'J'ai supprimé le second arraylist innsary mais ne fonctionne toujours pas – SanHappy

+0

@SanHappy je l'ai édité –

+0

Mauvaise chance à nouveau. Maintenant, recevez 40 articles à nouveau. J'ai essayé avec 'HashSet' comme vous me l'avez dit et ensuite avec' LinkedHashSet' parce que j'ai besoin du respect de la commande mais les deux me donnent 40 items (20 répétés). – SanHappy