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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
#1

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

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

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

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


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

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

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

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

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

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

RecyclerView создание Item Click Listener - Программирование Android
Здравствуйте. Недавно начал изучать Android. Дошел до изучения RecyclerView. Научился создавать RecyclerView и отображать там данные из БД....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
25.02.2016, 16:19 #2
Java
1
recyclerView.getAdapter().notifyDataSetChanged();
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
25.02.2016, 16:21 #3
disx, не помню, как это делается в RecyclerView, но в ListView это делается через обновление адаптера.
adapter.notifyDataSetChanged();
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
25.02.2016, 17:06  [ТС] #4
Spelcrawler, CoolMind,

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

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

CoolMind,
Вам нужно в отладчике проверить, что данные изменены перед выполнением notifyDataSetChanged.
как это проверить?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
26.02.2016, 09:06 #8
Цитата Сообщение от disx Посмотреть сообщение
как это проверить?
Смотрите. У вас адаптер связан с данными. Вы, когда его создаёте, передаёте на вход конструктора какой-то список. Допустим, это коллекция items типа ArrayList. Туда же вы добавляете данные через items.add(что-то).
В приложенном примере я этого не вижу. Вы добавляете данные куда-то, например, в БД, но не добавляете в коллекцию. Поэтому адаптер вам честно отображает неизменённые данные.
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
26.02.2016, 09:20  [ТС] #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
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
26.02.2016, 09:42 #10
Цитата Сообщение от disx Посмотреть сообщение
List<ItemData> items = new ArrayList<>();
Я не знаю, в какой момент вы вызываете функцию, но если items связан с адаптером, то это неправильно. Меняется источник данных (указатель на другой объект), а в адаптере хранится старый. Поэтому можно сделать так:
Java
1
items.clear();
Добавлено через 2 минуты
Естественно, перед этим items должен быть инициализирован (не равен null).
Всё это для ускорения можно делать в отдельном потоке, а обновлять через notifyDataSetChanged() - в UI-потоке.
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
26.02.2016, 11:54  [ТС] #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
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
26.02.2016, 12:12 #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();
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
26.02.2016, 14:19  [ТС] #13
CoolMind, спасибо за метод красиво получилось...

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

Java
1
2
3
 cursor = db.getAllDataSort();
                items = getItemsFromCursor(cursor, items);
                adapter.notifyDataSetChanged();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2016, 14:19
Привет! Вот еще темы с ответами:

RecyclerView| LongClick| set(View.VISIBLE) на выбранном item? - Программирование Android
Добрый день! подскажите пожалуйста как показать вьюшку только в той позиции item'а на которой сделали LongClick ? вьюшка...

Обновить список БД после добавление новой записи? - Программирование Android
При добавление записи в таблицу она добавляется в ListView, а при нажатие на какую либо строку списка ID бд выводится в TextView . Проблема...

Как изменять item listview не перерисовывая весь список? - Программирование Android
Здравствуйте! Имеется активити с выводом list при помощи SimpleCursorAdapter. При нажатии на любой item переносит в другой активити, где...

Список контактов с использованием RecyclerView и SQLite - Программирование Android
В продолжение темы - http://www.cyberforum.ru/android-dev/thread1840113.html Пример - обычная книжка контактов. Сами контакты хранятся...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.02.2016, 14:19
Ответ Создать тему
Опции темы

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