Обновление RecyclerView с ArrayList внутри и между фрагментами

#android #android-fragments #arraylist #android-recyclerview #data-transfer

#Android #android-фрагменты #arraylist #android-recyclerview #передача данных

Вопрос:

У меня MainActivity.class с двумя Fragments оба есть RecyclerView . Из фрагмента A я перехожу к фрагменту B fragmentTransaction.add(R.id.fragment_container1, fragment_b); , используя —> (В кратких данных из Sqldatabase put into ArrayList )
Теперь во фрагменте B, когда я изменяю некоторые данные, single RecyclerView Card я обновляю RecyclerView onActivityResult их следующим образом:

 
 @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == SECOND2_LAUNCH){
            if(resultCode == Activity.RESULT_OK){               
                  int modify_position = data.getIntExtra("key4", DEFAULT:0);
                  MyItem item = data.getParcelableExtra("key3");
                  data_list7.set(modify_position,item);
                  mAdapter_details.notifyItemChanged(modify_position);
                }
            }
            if (resultCode == Activity.RESULT_CANCELED){
                Toast.makeText(getContext(),"error", Toast.LENGTH_SHORT).show();
            }
        }
}
  

Например, я хочу изменить название элементов в позициях 1, 3, 5 без перезагрузки всех данных, например: adapter.notifydatasetchanged(); я предпочитаю использовать adapter.notifyItemChanged(int position) .
Фрагмент B имеет Recyclerview с динамической загрузкой, когда RecyclerView во фрагменте B загружаются все данные, он обновляется целиком Arraylist , поэтому данные, которые я изменил ранее (Recyclerview загружает все), не обновляются, работает только последний вызов data_list7.set(modify_position,item); , ранее измененные элементы не отображаются или возвращаются в предыдущее состояние (после загрузки RecyclerView всех данных и обновленияArraylist) почему?
Вторая проблема «тяжелее» из-за данных, которые я изменил во Fragmnet B Recyclerview , я должен показывать во фрагменте A при нажатии кнопки «Назад», я возвращаюсь к фрагменту A, а затем я также должен обновить эти данные … (без перезагрузки всех данных). Кроме того, проблема в том, что фрагмент A использует разные RecyclerView Adapter , поэтому мне приходится отправлять данные, а затем обновлять их по onResume onStart методу or во фрагменте A, но как это сделать. Эти решения приходят мне в голову: что касается второй проблемы.
1. Отправка данных через: Parcelable
2. Отправка данных через Intent
3. Реализует мой собственный интерфейс в RecyclerView_Adapter.class
4. Может быть, есть какой-то готовый метод (встроенный в Android) в RecyclerView или в RecyclerView_Adapter
5. Возможно, мне следует внести некоторые изменения в onBindViewHolder обновление моих элементов…
Что касается первой проблемы:
код:

 if(resultCode == Activity.RESULT_OK){               
                  int modify_position = data.getIntExtra("key4", DEFAULT:0);
                  MyItem item = data.getParcelableExtra("key3");
                  data_list7.set(modify_position,item);
                  mAdapter_details.notifyItemChanged(modify_position);
                }
  

Я должен поместить в массив или использовать цикл while / for.
Мне нужно использовать это много раз:

 data_list7.set(modify_position,item);               
mAdapter_details.notifyItemChanged(modify_position);
  

Итак, это все, заранее спасибо.

Комментарии:

1. Сначала, чтобы перезагрузить фрагмент A, вы можете изменить транзакцию.добавить в транзакцию.заменить

2. Да, я это знаю, «добавить» сделано мной сознательно.

Ответ №1:

Решение 1. Вы можете хранить данные в базе данных Room и просматривать их через LiveData<List<MyItem>> пользовательский интерфейс и адаптер обновления.

Решение 2. Вы можете разделить ViewModel между двумя фрагментами без сохранения в базе данных

Решение 3. Передача данных между фрагментами через новый API результатов

Комментарии:

1. Я выбираю решение номер 3, потому что это намного проще, для моего первого проекта, но сейчас у меня 2 проблемы. Первая проблема с массивами. Передача данных из фрагмента B во фрагмент A. У меня одинаковая позиция курсора, но разные позиции в массивах (например, во фрагменте B отредактированная позиция равна 2, а во фрагменте A эти данные находятся в позиции 4, так как обновить ArrayList во фрагменте A? Во-вторых, как вызывать это много раз? Я не могу назначить его переменным, потому что я не знаю, сколько раз (я имею в виду RecyclerView card) пользователь будет редактировать. Я думаю, я должен использовать цикл while с итерациями, верно?

2. Я думаю, что для этого случая предпочтительным способом является хранение данных в базе данных. Вы можете получить обновленную запись из любого места. Вы можете создать базу данных в памяти, если данные являются временными

3. Могу я попросить вас привести пример? У меня нет воображения, как это сделать.

4. Вот о базе данных room: medium.com/mindorks /…

5. Я ничего не знал о базе данных Room. Я уже сделал учебник, но я не знаю, что делать с моим: Some_class extends SQLiteOpenHelper в этом классе я создал таблицу со столбцами, поэтому этот класс должен остаться, я прав? Теперь. Когда я создаю примерный элемент, он отлично отображается в RecyclerView, но когда я использую программу просмотра базы данных (например, Firefox имеет для этого некоторое расширение), он не показывает мне ни одного столбца раньше, У меня есть вся структура базы данных (имя и тип столбцов и т. Д.), Поэтому мой вопрос в том, должно ли это быть так?