Recyleview иногда добавляет новый элемент в топ - PullRequest
0 голосов
/ 07 марта 2019

Я добавляю новый макет в RecycleView по нажатию кнопки «плюс» предыдущего макета. Сначала я добавляю пустые данные в класс модели и устанавливаю адаптер для одного элемента. После этого нажатия кнопки мне нужно добавить второй элемент и так далее.

Проблема есть. сначала это работает, и переработка просмотра с одним элементом отображается. при нажатии кнопки второй макет также добавляется ниже первого. но в третий раз, если я нажму на эту кнопку. это добавление нового элемента в верхнюю часть Recycleview. Мне нужно создать вертикальную иерархию.

Добавление первых данных в onCreate

var arrayList:ArrayList<SubjectModel> = ArrayList()

        var model = SubjectModel()
        arrayList.add(model)

        var adapter = SubjectListAdapter(arrayList)

        var layoutManager  = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)

        rv_subject.layoutManager = layoutManager
        rv_subject.adapter = adapter

И внутри адаптера. У меня есть кнопка плюс, которая добавляет новый элемент по вертикали.

      holder.img_delete_subject.setTag(position);
    holder.img_delete_subject.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            if (if it is plus ) {

                holder.img_delete_subject.setImageResource(minus image);

                data.add(data.size(),new SubjectModel());
                notifyItemInserted((data.size() - 1));

            } else {

                data.remove(Integer.parseInt(view.getTag().toString()));
              notifyItemRemoved(Integer.parseInt(view.getTag().toString()));

            }


        }
    });

1 Ответ

1 голос
/ 07 марта 2019

Проблема с notifiyDataSetChanged(). Как сказано в документации:

         * <p>This event does not specify what about the data set has changed, forcing
         * any observers to assume that all existing items and structure may no longer be valid.
         * LayoutManagers will be forced to fully rebind and relayout all visible views.</p>

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

notifyItemInsterted(position: Int)
        /**
         * Notify any registered observers that the item reflected at <code>position</code>
         * has been newly inserted. The item previously at <code>position</code> is now at
         * position <code>position + 1</code>.
         *
         * <p>This is a structural change event. Representations of other existing items in the
         * data set are still considered up to date and will not be rebound, though their
         * positions may be altered.</p>
         *
         * @param position Position of the newly inserted item in the data set
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...