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

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

Войти
Регистрация
Восстановить пароль
 
Vladiuss
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 37
#1

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

30.05.2016, 15:01. Просмотров 664. Ответов 9
Метки нет (Все метки)

Проблема такова, после добавления элемента в БД, список элементов Recycle View не обновляется, приходится заново пересоздавать фрагмент, а хотелось бы что бы строчка сразу появлялась + с анимацией.

В списке элементов нажимаю кнопочку, открывается новое активити в нем я заполняю поля и нажимаю записать, данные записываются в БД, активити закрывается и я возвращаюсь обратно в список элементов, который не обновился.

Адаптеру Recycle View передаю курсор, у адаптеру прописываю notifyDataSetChanged в момент возврата в список, подскажите что не так?

Это в активити где находится список элементов:
Java
1
2
3
4
5
    @Override
    public void onResume() {
        clientList_adapter.notifyDataSetChanged();
        super.onResume();
    }
Адаптер:
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
public class ClientsList_adapter extends RecyclerView.Adapter<ClientsList_adapter.ViewHolder> {
    private Cursor mDataset;
 
    public ClientsList_adapter(Cursor myDataset) {
        mDataset = myDataset;
    }
 
    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
 
        public ViewHolder(View   v) {
            super(v);
            mTextView = (TextView)v.findViewById(R.id.client_name_txt);
        }
    }
 
    @Override
    public ClientsList_adapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                             int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.clients_list_item, parent, false);
 
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }
 
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        mDataset.moveToPosition(position);
 
        String val = mDataset.getString(1);
 
        holder.mTextView.setText(val);
    }
 
    @Override
    public int getItemCount() {
        return mDataset.getCount();
    }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2016, 15:01     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor
Посмотрите здесь:
Android Как обновить список RecyclerView после добавления item?
Что за view используется для меню в OneDrive Android
Android Как после удаления view компонентов (removeAllViews) вернуть их?
Android Как обновить textview в фрагменте после обновления preference
FireBase + RecyclerView| как обновить список, после удаления item из базы? Android
Добавление элемента - наследника View Android
Android Обработка нажатия каждого элемента List View
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
30.05.2016, 17:08     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #2
Vladiuss, попробуй перед этой строчкой
Java
1
clientList_adapter.notifyDataSetChanged();
сделать получение данных из курсора...
хотя я бы вместо notifyDataSetChanged() заново засетил adapter списку.
Vladiuss
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 37
30.05.2016, 17:41  [ТС]     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #3
Да, я так и сделал, засетил адаптер с новым курсором )
Но хотелось бы по другому, что бы строка с анимацией появлялась ))))

Ещё раз получить данные это вот так Cursor cursor = db.query(TABLE_CLIENTS, null, null, null, null, null, null); ?
disx
20 / 20 / 0
Регистрация: 26.02.2014
Сообщений: 535
Записей в блоге: 1
30.05.2016, 18:09     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #4
Vladiuss, MainActivity:
Java
1
recyclerView.setItemAnimator(new DefaultItemAnimator());
и

Java
1
2
3
4
5
6
7
8
9
public void reFresh(){
 
        if (cursor!=null) {
            cursor = db.getAllData2();
            items = getItemsFromCursor(cursor, items);
            rvAdapter.notifyDataSetChanged();
            Log.d(LOG_TAG, "reFresh");
        }
    }
в активити где добавляю вызывал вышеприведенный метод так(но у меня фрагмент):
Java
1
2
3
4
Fragment fragment = getFragmentManager().findFragmentById(R.id.container_body);
    if (fragment != null && fragment instanceof NameFragment) {
        ((NameFragment) fragment).reFresh();
    }
Ещё раз получить данные это вот так
как-то так...
Vladiuss
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 37
01.06.2016, 17:43  [ТС]     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #5
Список обновляю вот так:

Java
1
2
3
4
5
6
        SQLiteDatabase db = MainMenu.dbhelper.getWritableDatabase();
        Cursor cursor = db.query(TABLE_CLIENTS, null, null, null, null, null, null);
 
        clientList_adapter = new ClientsList_adapter(cursor);
        client_list.setAdapter(clientList_adapter);
        clientList_adapter.notifyDataSetChanged();
Но анимации нет (((
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
01.06.2016, 21:28     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #6
Vladiuss, нужно в конструкторе адаптера добавить строку
Java
1
setHasStableIds(true);
И переопределить метод getItemId(), в нем нужно возвращать реальные ид элементов

Добавлено через 2 минуты
И не нужно пересоздавать адаптер, можно в него добавить метод, например, update(Cursor)
Java
1
2
3
4
public void update(Cursor cursor) {
    mCursor = cursor;
    notifyDataSetChanged();
}
И потом в коде получать новый курсор и передавать его в этот метод.
Vladiuss
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 37
02.06.2016, 12:35  [ТС]     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #7
А зачем нужен getItemId()? Где его использовать?

setHasStableIds(true); Добавил в конструктор

Затем дописал так как вы рекомендовали

Java
1
2
3
4
5
6
7
8
9
  @Override
    public void onResume() {
        SQLiteDatabase db = MainMenu.dbhelper.getWritableDatabase();
        Cursor cursor = db.query(TABLE_CLIENTS, null, null, null, null, null, null);
 
        update(cursor);
 
        super.onResume();
    }
Java
1
2
3
4
5
public void update(Cursor cursor) {
        mCursor = cursor;
 
        clientList_adapter.notifyDataSetChanged();
    }
Ничего не поменялось (( После notifyDataSetChanged ничего вообще не обновляется, в адаптере данные те же остаются.
Pablito
2459 / 1904 / 591
Регистрация: 12.05.2014
Сообщений: 6,712
Завершенные тесты: 1
02.06.2016, 12:39     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #8
явно же написано - создать метод update в АДАПТЕРЕ, а не во фрагменте
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
02.06.2016, 12:43     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #9
getItemId нужен, чтобы адаптер мог узнать какие именно элементы были добавлены а какие просто изменились, этот метод тоже должен быть в адаптере.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2016, 13:58     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor
Еще ссылки по теме:
Recycle/CardView NullPointerException Android
После поворота экрана view формы пропадают Android
Android После setVisibility(View.GONE) не могу сделать элемент видимым
Сдвиг элементов layout при добавлении нового элемента Android
Android Обновление ListView после добавления записи

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

Или воспользуйтесь поиском по форуму:
Vladiuss
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 37
02.06.2016, 13:58  [ТС]     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor #10
Всем спасибо за помощь, получилось!

Решил данные передавать через ArrayList. А адаптере добавил метод, в котором заменяю лист на новый:
Java
1
2
3
4
5
    public void update(ArrayList<ClientItem> myData){
        mData = myData;
 
        notifyDataSetChanged();
    }
Ну и в активити где находится список:
Java
1
2
3
4
5
6
7
8
9
10
11
   @Override
    public void onResume() {
        SQLiteDatabase db = MainMenu.dbhelper.getWritableDatabase();
        Cursor cursor = db.query(TABLE_CLIENTS, null, null, null, null, null, null);
 
        ArrayList<ClientItem> newData = getDataFromCursor(cursor);
 
        clientList_adapter.update(newData);
 
        super.onResume();
    }
Yandex
Объявления
02.06.2016, 13:58     Как обновить Recycle View после добавления нового элемента в БД? Используется Cursor
Ответ Создать тему
Опции темы

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