С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/88: Рейтинг темы: голосов - 88, средняя оценка - 4.66
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684

Как обновить список RecyclerView после добавления item?

25.02.2016, 16:08. Показов 17053. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как обновить список RecyclerView после добавления item?

список RecyclerView в DialogFragment, из контактов добавляется номер который должен отображаться в списке, но он там становится виден только после перезапуска диалога, как это можно исправить?


Подскажите пожалуйста кто сталкивался...
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2016, 16:08
Ответы с готовыми решениями:

FireBase + RecyclerView| как обновить список, после удаления item из базы?
Добрый всем день! есть метод который удаляет айтем (значения items берутся из FireBase): public void DelPos(View v){ ...

Не могу обновить RecyclerView после изменения item
данные для списка берутся из Firebase, у DatabaseReference//Firebase, есть два метода: onChildAdd и onChildChanged, первый...

Не обновляется список после добавления item'a на страницу ViewPager?
для добавления item в список используется отдельная активити, сама запись добавляется но при закрытии активити в списке не видна. ...

12
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
25.02.2016, 16:19
Java
1
recyclerView.getAdapter().notifyDataSetChanged();
1
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
25.02.2016, 16:21
disx, не помню, как это делается в RecyclerView, но в ListView это делается через обновление адаптера.
adapter.notifyDataSetChanged();
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
25.02.2016, 17:06  [ТС]
Spelcrawler, CoolMind,

вставил это
Java
1
recyclerView.getAdapter().notifyDataSetChanged();
в конце метода onActivityResult() ... проблема осталась....?!
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
25.02.2016, 17:14
Цитата Сообщение от disx Посмотреть сообщение
в конце метода onActivityResult()
Нужно сразу после добавления нового item'a.
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
25.02.2016, 18:37
disx, notifyDataSetChanged обновляет список, если данные поменялись. Т.е. добавились, изменились или удалились. Кроме того, её нужно запускать в UI-потоке (думаю, это у вас и так), иначе возникнет ошибка. Вам нужно в отладчике проверить, что данные изменены перед выполнением notifyDataSetChanged.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
26.02.2016, 08:50  [ТС]
Spelcrawler, При выборе номера контакта (для добавления в список recyclerview) в методе onActivityResult(), выполняется метод controlRec() в котором есть такие строки:

Java
1
2
 db.addRec(number, nameContact, time);
            recyclerView.getAdapter().notifyDataSetChanged();
и нифига, не работает, вообще че ему еще надо?

CoolMind,
Вам нужно в отладчике проверить, что данные изменены перед выполнением notifyDataSetChanged.
как это проверить?
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
26.02.2016, 09:06
Цитата Сообщение от disx Посмотреть сообщение
как это проверить?
Смотрите. У вас адаптер связан с данными. Вы, когда его создаёте, передаёте на вход конструктора какой-то список. Допустим, это коллекция items типа ArrayList. Туда же вы добавляете данные через items.add(что-то).
В приложенном примере я этого не вижу. Вы добавляете данные куда-то, например, в БД, но не добавляете в коллекцию. Поэтому адаптер вам честно отображает неизменённые данные.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
26.02.2016, 09:20  [ТС]
CoolMind,

есть такое:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static List<ItemData> getItemsFromCursor(Cursor cursor){
 
        List<ItemData> items = new ArrayList<>();
        while(cursor.moveToNext()){
         
            String phone = cursor.getString(cursor.getColumnIndex("number"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
         
            items.add(new ItemData(phone, name));
 
        }
 
        return items;
 
    }
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
26.02.2016, 09:42
Цитата Сообщение от disx Посмотреть сообщение
List<ItemData> items = new ArrayList<>();
Я не знаю, в какой момент вы вызываете функцию, но если items связан с адаптером, то это неправильно. Меняется источник данных (указатель на другой объект), а в адаптере хранится старый. Поэтому можно сделать так:
Java
1
items.clear();
Добавлено через 2 минуты
Естественно, перед этим items должен быть инициализирован (не равен null).
Всё это для ускорения можно делать в отдельном потоке, а обновлять через notifyDataSetChanged() - в UI-потоке.
0
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
26.02.2016, 11:54  [ТС]
CoolMind, тяжело, вот:

Adapter:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.dis.babygpspro;
 
/**
 * Created by Nata on 25.02.2016.
 */
 
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
import java.util.List;
 
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
 
    private List<ItemData> recordsNUM;
 
    public RecyclerViewAdapter(List<ItemData> recordsNUM) {
        this.recordsNUM = recordsNUM;
 
    }
    /**
     * Создание новых View и ViewHolder элемента списка, которые впоследствии могут переиспользоваться.
     */
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_last_contacts, viewGroup, false);
        return new ViewHolder(v);
    }
 
    /**
     * Заполнение виджетов View данными из элемента списка с номером i
     */
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        ItemData record = recordsNUM.get(i);
 
        viewHolder.textNumber.setText(record.getTitleNumber());
        viewHolder.textName.setText(record.getTitleName());
 
    }
 
    @Override
    public int getItemCount() {
        return recordsNUM.size();
    }
 
    /**
     * Реализация класса ViewHolder, хранящего ссылки на виджеты.
     */
    class ViewHolder extends RecyclerView.ViewHolder {
        private TextView textNumber;
        private TextView textName;
        TextView textDevider;
 
        public ViewHolder(View itemView) {
            super(itemView);
            textNumber = (TextView) itemView.findViewById(R.id.textNumber);
            textName = (TextView) itemView.findViewById(R.id.textName);
            textDevider = (TextView) itemView.findViewById(R.id.textviewDevider);
        }
    }
 
}


Dialog:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
     
        View view = inflater.inflate(R.layout.dialog_send_sms, container, false);
        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
 
        db = new DB(getActivity());
        db.open();
        cursor = db.getAllDataSort();
 
        recyclerView = (RecyclerView)view.findViewById(R.id.recycler_LastCont);
 
        final List<ItemData> items = getItemsFromCursor(cursor);
        cursor.close();
        
        //data = items.get(i);
       // numberCon = data.getTitleNumber();
       // name = data.getTitleName();
 
        adapter = new RecyclerViewAdapter(items);
 
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
 
private void pickContact() {
        Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
        pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
        startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
 
      //  chooseNumber.setText(String.valueOf(pickContactIntent));
    }
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Check which request it is that we're responding to
        if (requestCode == PICK_CONTACT_REQUEST) {
            // Make sure the request was successful
            if (resultCode == getActivity().RESULT_OK) {
                // Get the URI that points to the selected contact
                Uri contactUri = data.getData();
                // We only need the NUMBER column, because there will be only one row in the result
                String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME};
               
                Cursor cursor = getActivity().getContentResolver()
                        .query(contactUri, projection, null, null, null);
                cursor.moveToFirst();
 
                //String nameContact = null;
                // Retrieve the phone number from the NUMBER column
                int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                int column2 = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                number = cursor.getString(column);
                nameContact =  cursor.getString(column2);
 
                chooseNumber.setText(number);
                cursor.close();
                // добавляем запись в базу
                controlRec();
 
                // Do something with the phone number...
            }
        }
    }
    public static List<ItemData> getItemsFromCursor(Cursor cursor){
 
        List<ItemData> items = new ArrayList<>();
        while(cursor.moveToNext()){
 
            String phone = cursor.getString(cursor.getColumnIndex("number"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
 
            items.add(new ItemData(phone, name));
 
        }
 
        return items;
 
    }


items.clear(); не понимаю где это сделать?
и правильно ли смотрю?
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
26.02.2016, 12:12
Лучший ответ Сообщение было отмечено disx как решение

Решение

Вроде бы, неплохо написан код.
Вот у вас заполнение данными: final List<ItemData> items = getItemsFromCursor(cursor);
Вот у вас соединение данных с адаптером: adapter = new RecyclerViewAdapter(items);
Цитата Сообщение от disx Посмотреть сообщение
items.clear(); не понимаю где это сделать?
Дальше у вас написано не совсем чётко.
Java
1
2
3
4
5
number = cursor.getString(column);
nameContact =  cursor.getString(column2);
...
// добавляем запись в базу
controlRec();
И здесь бы надо обновить данные, но этого нет. Я бы делал так.
Во-первых, переписал бы метод getItemsFromCursor, например, так.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public static List<ItemData> getItemsFromCursor(Cursor cursor, List<ItemData> items){
        if (items == null)
            items = new ArrayList<>();
        else
            items.clear();
        while(cursor.moveToNext()){
            String phone = cursor.getString(cursor.getColumnIndex("number"));
            String name = cursor.getString(cursor.getColumnIndex("name"));
            items.add(new ItemData(phone, name));
        }
 
        return items;
    }
Во-вторых, вы можете не читать из БД каждый раз, если новая запись точно попадёт в конец списка. В этом случае я бы просто после // Do something with the phone number... написал бы так:
Java
1
2
items.add(new ItemData(number, nameContact));
adapter.notifyDataSetChanged();
Но можно и так:
Java
1
2
items = getItemsFromCursor(cursor, items);
adapter.notifyDataSetChanged();
1
23 / 23 / 0
Регистрация: 26.02.2014
Сообщений: 684
26.02.2016, 14:19  [ТС]
CoolMind, спасибо за метод красиво получилось...

короче в onActivityResult() еще надо было правильный курсор с сортировкой получить и все пошло:

Java
1
2
3
 cursor = db.getAllDataSort();
                items = getItemsFromCursor(cursor, items);
                adapter.notifyDataSetChanged();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2016, 14:19
Помогаю со студенческими работами здесь

Как обновить datagridview после добавления записи?
Как можно обновить datagridview после добавленич записи? string connectionString = &quot;Provider=Microsoft.Jet.OLEDB.4.0;Data...

Как сразу обновить информацию после добавления в БД?
Всем привет. Возник вопрос, как сразу обновить информацию после добавления в бд?

Как правильно обновить DataGrid после добавления строки
Уважаемые Гуру! В ZAML имеется DataGrid с привязкой к ObservableCollection: &lt;Grid Grid.Row=&quot;1&quot; Name=&quot;оснТаблица&quot; ...

Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor
Проблема такова, после добавления элемента в БД, список элементов Recycle View не обновляется, приходится заново пересоздавать фрагмент, а...

RecyclerView создает Item на размер экрана, как исправить?
Аномалии, сменил версию RecyclerView с 21.0.+ на 23.3.0. Теперь он создает 1 элемент на весь размер экрана. Т.е элемент CardView создается...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru