#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 имеет для этого некоторое расширение), он не показывает мне ни одного столбца раньше, У меня есть вся структура базы данных (имя и тип столбцов и т. Д.), Поэтому мой вопрос в том, должно ли это быть так?