Как я могу удалить повторяющиеся элементы в ArrayList ‹Object› с помощью LinkedHashSet?

Я пробовал много вещей, чтобы решить эту проблему, и часами искал решение, мне нужна помощь в этом. У меня есть список, импортирующий данные из MySQL и извлекающий данные в Listview. Моя проблема: повторяющиеся элементы списка (только первые 20, затем я использую «loadmoredata» и получаю при прокрутке вниз новые 20 элементов, но больше не повторяются элементы). Итак, первый раз вижу 40 пунктов (20 повторных).

Я пробовал LinkedHashSet, но не могу заставить это работать. Какие-либо предложения?

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();

РЕДАКТИРОВАТЬ: с модификацией @Japu_D_Cret

    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;
    }

А это мой 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;
}

person SanHappy    schedule 25.03.2017    source источник
comment
вы не используете набор. вы копируете содержимое в newList, но фактически не используете его. смотри мой ответ ниже   -  person Japu_D_Cret    schedule 25.03.2017
comment
если на ваш вопрос есть ответ, пожалуйста, отметьте ответ   -  person Japu_D_Cret    schedule 25.03.2017


Ответы (1)


в этих строках вы сначала создаете элементы ArrayList, затем копируете его содержимое в набор Set, затем копируете содержимое Sets в новый новый список ArrayList.

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

я бы удалил все ненужные списки и пошел бы только с набором, поэтому ваш код будет выглядеть так

//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;
}

после вашего отзыва я изменил его, поэтому он использует только Set внутри функции:

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;
}
person Japu_D_Cret    schedule 25.03.2017
comment
Я старался. Если я это сделаю, я получаю 0 предметов и вылетаю. Мне нужно как минимум private ArrayList<Usuarios> items, потому что я должен использовать его в адаптере adapter=new Usuarios_adapter(activity,items); Я удалил ненужный второй массив, но все равно не работает - person SanHappy; 25.03.2017
comment
Опять не повезло. Теперь снова получите 40 предметов. Я пробовал с HashSet, как вы мне сказали, а затем с LinkedHashSet, потому что мне нужно соблюдать порядок, но оба дают мне 40 предметов (20 повторяются). - person SanHappy; 25.03.2017
comment
@SanHappy, вы можете отредактировать свой вопрос и добавить, как теперь выглядит ваш код? может быть, просто небольшая опечатка сейчас :) - person Japu_D_Cret; 25.03.2017
comment
Я вставил свой getView - person SanHappy; 25.03.2017
comment
@SanHappy хорошо, Set может определить, является ли объект дубликатом, только если вы переопределите метод equals (поэтому ваш класс Usuarios должен переопределить его и проверить с помощью первичного ключа (т.е. ID)), см. это для справки stackoverflow.com/questions/16462644/ - person Japu_D_Cret; 25.03.2017
comment
Даааа, работает!!!! я добавил hascode и равный в классе и... работает отлично! Спасибо. - person SanHappy; 25.03.2017
comment
@SanHappy очень рад это слышать :) хорошего дня - person Japu_D_Cret; 25.03.2017