Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
disx
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
25.02.2016, 16:08     Как обновить список RecyclerView после добавления item? #1
Как обновить список RecyclerView после добавления item?

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


Подскажите пожалуйста кто сталкивался...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2016, 16:08     Как обновить список RecyclerView после добавления item?
Посмотрите здесь:

Как изменять item listview не перерисовывая весь список? Android
RecyclerView создание Item Click Listener Android
Android Обновить список БД после добавление новой записи?
Не обновляется список после добавления item'a на страницу ViewPager? Android
Как создать RecyclerView c передвигаемыми элементами? Android
Вставить фрагмент после определённого эленета в RecyclerView Android
Как настроить RecyclerView ? Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
25.02.2016, 16:19     Как обновить список RecyclerView после добавления item? #2
Java
1
recyclerView.getAdapter().notifyDataSetChanged();
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
25.02.2016, 16:21     Как обновить список RecyclerView после добавления item? #3
disx, не помню, как это делается в RecyclerView, но в ListView это делается через обновление адаптера.
adapter.notifyDataSetChanged();
disx
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
25.02.2016, 17:06  [ТС]     Как обновить список RecyclerView после добавления item? #4
Spelcrawler, CoolMind,

вставил это
Java
1
recyclerView.getAdapter().notifyDataSetChanged();
в конце метода onActivityResult() ... проблема осталась....?!
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
25.02.2016, 17:14     Как обновить список RecyclerView после добавления item? #5
Цитата Сообщение от disx Посмотреть сообщение
в конце метода onActivityResult()
Нужно сразу после добавления нового item'a.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
25.02.2016, 18:37     Как обновить список RecyclerView после добавления item? #6
disx, notifyDataSetChanged обновляет список, если данные поменялись. Т.е. добавились, изменились или удалились. Кроме того, её нужно запускать в UI-потоке (думаю, это у вас и так), иначе возникнет ошибка. Вам нужно в отладчике проверить, что данные изменены перед выполнением notifyDataSetChanged.
disx
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
26.02.2016, 08:50  [ТС]     Как обновить список RecyclerView после добавления item? #7
Spelcrawler, При выборе номера контакта (для добавления в список recyclerview) в методе onActivityResult(), выполняется метод controlRec() в котором есть такие строки:

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

CoolMind,
Вам нужно в отладчике проверить, что данные изменены перед выполнением notifyDataSetChanged.
как это проверить?
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
26.02.2016, 09:06     Как обновить список RecyclerView после добавления item? #8
Цитата Сообщение от disx Посмотреть сообщение
как это проверить?
Смотрите. У вас адаптер связан с данными. Вы, когда его создаёте, передаёте на вход конструктора какой-то список. Допустим, это коллекция items типа ArrayList. Туда же вы добавляете данные через items.add(что-то).
В приложенном примере я этого не вижу. Вы добавляете данные куда-то, например, в БД, но не добавляете в коллекцию. Поэтому адаптер вам честно отображает неизменённые данные.
disx
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
26.02.2016, 09:20  [ТС]     Как обновить список RecyclerView после добавления item? #9
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;
 
    }
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
26.02.2016, 09:42     Как обновить список RecyclerView после добавления item? #10
Цитата Сообщение от disx Посмотреть сообщение
List<ItemData> items = new ArrayList<>();
Я не знаю, в какой момент вы вызываете функцию, но если items связан с адаптером, то это неправильно. Меняется источник данных (указатель на другой объект), а в адаптере хранится старый. Поэтому можно сделать так:
Java
1
items.clear();
Добавлено через 2 минуты
Естественно, перед этим items должен быть инициализирован (не равен null).
Всё это для ускорения можно делать в отдельном потоке, а обновлять через notifyDataSetChanged() - в UI-потоке.
disx
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
26.02.2016, 11:54  [ТС]     Как обновить список RecyclerView после добавления item? #11
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(); не понимаю где это сделать?
и правильно ли смотрю?
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
26.02.2016, 12:12     Как обновить список RecyclerView после добавления item? #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вроде бы, неплохо написан код.
Вот у вас заполнение данными: 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();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2016, 14:19     Как обновить список RecyclerView после добавления item?
Еще ссылки по теме:

Android RecyclerView создает Item на размер экрана, как исправить?
Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor Android
Android Как уменьшить количество layouts для RecyclerView
Android Список контактов с использованием RecyclerView и SQLite
Android Как отследить событие OnClick в RecyclerView

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

Или воспользуйтесь поиском по форуму:
disx
18 / 18 / 0
Регистрация: 26.02.2014
Сообщений: 403
26.02.2016, 14:19  [ТС]     Как обновить список RecyclerView после добавления item? #13
CoolMind, спасибо за метод красиво получилось...

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

Java
1
2
3
 cursor = db.getAllDataSort();
                items = getItemsFromCursor(cursor, items);
                adapter.notifyDataSetChanged();
Yandex
Объявления
26.02.2016, 14:19     Как обновить список RecyclerView после добавления item?
Ответ Создать тему
Опции темы

Текущее время: 00:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru