Программно добавить новый элемент в recyclerview?


115

Я все еще пытаюсь разобраться в recyclerview. У меня есть arraylist, который я использую для инициализации представления ресайклера.

Как я могу добавить новые элементы в сообщение о просмотре ресайклера, установив адаптер и диспетчер макетов?

private void initData() {
        mItems = new ArrayList<String>();
        for (int i = 0; i < ITEMS_COUNT; i++) {
            mItems.add("Item " + (i + 1));
        }
    }

    private void initRecyclerView() {
        mRecentRecyclerView = (RecyclerView) findViewById(R.id.recentrecyclerView);
        mRecentRecyclerView.setHasFixedSize(true);
        mRecentLayoutManager = new LinearLayoutManager(this);
        mRecentRecyclerView.setLayoutManager(mRecentLayoutManager);



        mAdapter = new RecyclerView.Adapter<CustomViewHolder>() {
            @Override
            public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.notice_snippet
                        , viewGroup, false);
                return new CustomViewHolder(view);
            }

            @Override
            public void onBindViewHolder(CustomViewHolder viewHolder, int i) {
                viewHolder.noticeSubject.setText(mItems.get(i));
            }

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

        };
        mRecentRecyclerView.setAdapter(mAdapter);

    private class CustomViewHolder extends RecyclerView.ViewHolder {

        private TextView noticeSubject;

        public CustomViewHolder(View itemView) {
            super(itemView);

            noticeSubject = (TextView) itemView.findViewById(R.id.notice_subject);
        }
    }

Итак, в основном после того , как я initdata()и initRecyclerView(), как мне добавить новый элемент в RecyclerView ??


Вы можете увидеть этот пример в счастливом коде Github !!!
Cabezas

Ответы:


273

Сначала добавьте свой элемент, mItemsа затем используйте:

mAdapter.notifyItemInserted(mItems.size() - 1);

этот метод лучше, чем использование:

mAdapter.notifyDataSetChanged();

в исполнении.


11
Хороший ответ. Это также означает, что он не сломает анимацию,
Бен Пирсон,

7
Это следует принять как правильный ответ, второй ломает анимацию и менее эффективен, чем этот.
Массимо

27
Я тот, кто ответил на принятый ответ, и я думаю, что это должен быть принятый: D
Абдельрахман Элькади

2
@AJW да. индекс последнего элемента mItems равен mItems.size () - 1.
Мостафа

2
Спасибо! У меня есть изображения, которые нужно загрузить из Интернета в onBindViewHolder. Каждый раз, когда я получаю данные, мне нужно добавить их в список и вызвать notifyDataSetChanged (). Но это создавало эффект мерцания изображения. Выше было правильное решение, которое я искал. Вы также можете использовать mAdapter.notifyItemRangeInserted (mItems.size () - 1, new_array_of_items_to_be_added.size ());
Виньеш Бала

38

просто добавьте в свою структуру данных (mItems), а затем уведомите адаптер об изменении набора данных

private void addItem(String item) {
  mItems.add(item);
  mAdapter.notifyDataSetChanged();
}

addItem("New Item");

2
Что, если я хочу добавить не строку, а ViewGroup?
Игорь Ганапольский

1
@IgorGanapolsky Я тоже сомневаюсь. Вы нашли для этого какое-нибудь решение?
Sash_KP

такие же сомнения и здесь! любая помощь?
Srujan Barai

5
@IgorGanapolsky Тип элемента будет указан вашим адаптером, поэтому это может быть действительно любой объект. Но имейте в виду, что добавляемый вами элемент должен быть данными. RecyclerView имеет встроенные функции для наполнения и привязки представления, что и произойдет, когда вы notifyDataSetChanged (). Вы можете отладить onBindViewHolder, чтобы увидеть редактируемое представление.
Крис

1
@IgorGanapolsky Вам ArrayList<T>придется использовать тип объекта, который вы хотите добавить, например, ArrayList<ViewGroup>вместо ArrayList<String>. Затем вы можете просто изменить тип аргумента с Stringна ViewGroup. (Простите за некро).
Эрик Рид

14

если вы добавляете несколько элементов в список, используйте это:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Это уведомляет всех зарегистрированных наблюдателей о том, что отраженные в данный момент элементы itemCount, начиная с positionStart, были вновь вставлены. Элемент, ранее расположенный в positionStart и далее, теперь можно найти, начиная с позиции positinStart + itemCount.

существующий элемент в наборе данных все еще считается актуальным.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.