Додайте новий елемент до перегляду програмного забезпечення рециркулятора?


115

Я все ще намагаюся обвести голову навколо рециркулятора. У мене є 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 Happy !!!
Cabezas

Відповіді:


272

Спочатку додайте свій предмет, 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 ());
Vignesh Bala

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 має вбудовані функції для накачування та прив'язки подання, і саме це відбудеться, коли ви сповіститеDataSetChanged (). Ви можете налагодити на onBindViewHolder, щоб побачити вид, який редагується.
Кріс

1
@IgorGanapolsky Вам ArrayList<T>потрібно буде використовувати тип об'єкта, який ви хочете додати, наприклад, ArrayList<ViewGroup>замість цього ArrayList<String>. Тоді ви можете просто змінити тип аргументу з Stringна ViewGroup. (Вибачте за некроз).
Ерік Рід

14

якщо ви додаєте кілька елементів до списку, використовуйте це:

mAdapter.notifyItemRangeInserted(startPosition, itemcount);

Це сповіщає будь-яких зареєстрованих спостерігачів про те, що поточно відображений елементCount items, що починається з PositionStart, був нещодавно вставлений. Елемент, розташований раніше у позиціїStart і далі, тепер можна знайти, починаючи з позиції positinStart + itemCount

існуючий елемент у наборі даних як і раніше вважається актуальним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.