Как удалить повторяющиеся элементы из списка просмотра в Android - PullRequest
0 голосов
/ 19 октября 2018

Мне нужно заполнить listview пользовательскими элементами arraylist.Прежде чем пытаться получить его из моего API, я создал фиктивный массив с другим значением, применимым к адаптеру.Количество элементов, которые я положил туда, равно шести.Проблема в том, что элементы после четвертого повторяют заголовок, который является единственной переменной моего пользовательского объекта, перезапуская его с самого начала.результирующий список не 1-2-3-4-5-6, а 1-2-3-4-1-2.

МОЙ ПОЛЬЗОВАТЕЛЬСКИЙ АДАПТЕР

public class librettoAdapter extends ArrayAdapter<librettoDTO> {

Context context;

public librettoAdapter(Context context, int risorsaId,
                          List<librettoDTO> items) {
    super(context, risorsaId, items);
    this.context = context;
}


//metodo getView --> ritorna la view da inserire nella ListView

public View getView(int position, View convertView, ViewGroup parent) {

    //controllo se c'è gia un layout
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.libretto_element, null);

        librettoDTO content = getItem(position);

        TextView textTitolo = convertView.findViewById(R.id.nome_materia);
        textTitolo.setText(content.getTitolo());

    }
    return convertView;
}

}

НАСЕЛЕНИЕ СПИСКА

   inputItems = new ArrayList<librettoDTO>();

    /** RITORNA LA CHIAAMATA*/
    /** SOTITUIRE CON LIBRETTODTO */
    /* FACCIAMO FINTA CHE SIA IL RISULTATO DELA CHIAMATA */
    librettoDTO source1 = new librettoDTO("titolo1");
    librettoDTO source2 = new librettoDTO("titolo2");
    librettoDTO source3 = new librettoDTO("titolo3");
    librettoDTO source4 = new librettoDTO("titolo4");
    librettoDTO source5 = new librettoDTO("tsdasdadssa");
    librettoDTO source6 = new librettoDTO("6666666");

    inputItems.add(source1);
    inputItems.add(source2);
    inputItems.add(source3);
    inputItems.add(source4);
    inputItems.add(source5);
    inputItems.add(source6);



    contentItems = new ArrayList<librettoDTO>();

    for (int i = 0; i < inputItems.size(); i++) {

        //librettoDTO item = new librettoDTO(titoli[i]); //INIT DTO GET FROM ARRAY LIST
        librettoDTO item = inputItems.get(i);
        contentItems.add(item);

        //setto la listview e istanzio l'adapter che si prende lo stile xml e l'arraylist di content

        librettoAdapter adapter = new librettoAdapter(getContext(),
                R.layout.libretto_element, contentItems);


        listView = (ListView) v.findViewById(R.id.libretto_listview);
        listView.setAdapter(adapter);
        //setto il listener
        //listView.setOnItemClickListener(this);
    }

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

решено: только что прокомментировал проверку convertView

public View getView(int position, View convertView, ViewGroup parent) {

    //controllo se c'è gia un layout
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    //if (convertView == null) {
        convertView = mInflater.inflate(R.layout.libretto_element, null);

        librettoDTO content = getItem(position);

        TextView textTitolo = convertView.findViewById(R.id.nome_materia);
        textTitolo.setText(content.getTitolo());

        Toast.makeText(getContext(), content.getTitolo()+"", Toast.LENGTH_LONG).show();

    //}
    return convertView;
}
0 голосов
/ 19 октября 2018

Android Listview использует кеш для привязки вида. Например, если ваш экран покрывает только 4 элемента, для привязки 5. элемент listview использует один из элементов в cache.in четыре вызова getview, view будет нулевым, и вы его раздуете.Но для элемента 5. он может быть не нулевым из-за использования кэша. В вашем примере listview использовал первый элемент из кэша для 5. связывания элемента и внутри if (convertView == null) не будет запущен. Первый элемент будет показан для5. элемент.

изменить на:

 LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.libretto_element, null);
    }

   librettoDTO content = getItem(position);
   TextView textTitolo = convertView.findViewById(R.id.nome_materia);
   textTitolo.setText(content.getTitolo());

    return convertView;
0 голосов
/ 19 октября 2018

Использование RecyclerView Измените свой адаптер следующим образом

Адаптер librettoAdapter.class

public class librettoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List inputItems;

    public librettoAdapter(List<String> inputItems) {
        this.inputItems = inputItems;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        context = parent.getContext();
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_text, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        String text = inputItems.get(position);
        textview.settext(text);
    }

    @Override
    public int getItemCount() {
        return this.inputItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.textview)
        TextView textview;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);

        }
    }
}

Установка элементов на list

inputItems = new ArrayList<librettoDTO>();

/** RITORNA LA CHIAAMATA*/
/** SOTITUIRE CON LIBRETTODTO */
/* FACCIAMO FINTA CHE SIA IL RISULTATO DELA CHIAMATA */
librettoDTO source1 = new librettoDTO("titolo1");
librettoDTO source2 = new librettoDTO("titolo2");
librettoDTO source3 = new librettoDTO("titolo3");
librettoDTO source4 = new librettoDTO("titolo4");
librettoDTO source5 = new librettoDTO("tsdasdadssa");
librettoDTO source6 = new librettoDTO("6666666");

inputItems.add(source1);
inputItems.add(source2);
inputItems.add(source3);
inputItems.add(source4);
inputItems.add(source5);
inputItems.add(source6);

librettoAdapter = new librettoAdapter(keyList,valuesList);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(librettoAdapter);

или
, если вы все равно хотите использовать просмотр списка, попробуйте удалить условие if (convertView == null).

...