Обновление фрагмента не работает
Я изучаю Android, и, пытаясь разработать приложение, я столкнулся со следующей ситуацией:
У меня есть Activity, который имеет два Fragments
: ReminderListFragment
и FilterListFragment
. Первый фрагмент имеет список напоминаний, а второй - список фильтров с именем и количеством элементов, зарегистрированных в каждом фильтре. Однако, когда я исключаю некоторое напоминание, значения FilterListFragment не обновляются. То же самое происходит, когда я удаляю один из фильтров (в этом случае он удаляет все записи для выбранного фильтра), он не обновляет список напоминаний.
Код FilterListFragment
:
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getGroupId() == R.id.context_menu_category) {
// Used to verify it it is the right context_menu //Gets the item
// position and gets the category in that position:
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
Category category = ((CategoryFilter) lvFilters.getAdapter().getItem(info.position)).getCategory();
// Switch between the options in the context menu(Edit and Delete)
switch (item.getItemId()) {
case R.id.edit:
// Passes the current reminder to be edited via Intent and
// Invokes edit method
DialogFragment newFragment = EditCategoryDialogFragment.newInstance(category);
newFragment.show(getFragmentManager(), "" + R.string.dialog_editcategory_title);
updateListView();
return true;
case R.id.delete:
// Invokes delete method
try {
// Deletes from the bank;
Controller.instance(getActivity().getApplicationContext()).deleteReminderByCategory(category);
Controller.instance(getActivity().getApplicationContext()).deleteCategory(category);
updateListView();
return true;
} catch (DBException e) {
Log.e(TAG, e.getMessage());
}
updateListView();
return true;
default:
return super.onContextItemSelected(item);
}
}
return super.onContextItemSelected(item);
}
Код ReminderListFragment
:
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getGroupId() == R.id.context_menu_reminder) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
Reminder reminder = (Reminder) contextMenuAdapter.getItem(info.position);
switch (item.getItemId()) {
case R.id.edit:
Intent editIntent = editIntent(reminder);
editIntent.putExtra("id", reminder.getId());
editIntent.putExtra("text", reminder.getText());
editIntent.putExtra("details", reminder.getDetails());
startActivity(editIntent);
updateListView(null);
return true;
case R.id.delete:
try {
Controller.instance(getActivity().getApplicationContext()).deleteReminder(reminder);
} catch (DBException e) {
Log.e(TAG, e.getMessage());
}
updateListView(null);
return true;
default:
return super.onContextItemSelected(item);
}
}
return super.onContextItemSelected(item);
}
Ответы
Ответ 1
Я смог его решить, добавив следующие методы:
Класс FilterListFragment
:
public void reloadReminderListFragment() {
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.listReminders);
if (currentFragment instanceof ReminderListFragment) {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();
}
}
Класс ReminderListFragment
:
public void reloadFilterListFragment() {
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.listCategories);
if (currentFragment instanceof FilterListFragment) {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();
}
}
Ответ 2
Вы должны общаться со вторым фрагментом через активность. Когда вы делаете что-то в одном фрагменте, который должен влиять на второй, вы должны вызвать какой-то метод в своей деятельности, который вызовет метод обновления во втором фрагменте. Так, например, активность:
public class MainActivity extends Activity(){
private Fragment fragmentOne, fragmentTwo;
public void updateFragmentTwo(){
fragmentTwo.updateListView();
}
}
фрагмент:
public class FirstFragment extends Fragment{
public void updateFragmentTwo(){
((MyActivity)getActivity()).updateFragmentTwo();
}
}
Ответ 3
Для фрагментации фрагментации связи посредством одного действия было бы возможно через интерфейсы или я должен сказать обратные вызовы. Я думаю, что, реализуя интерфейс в своей деятельности, вы могли бы обмениваться обоими фрагментами и когда слушатель во фрагменте вызывается, вы можете выполнить действие соответствующим образом. Как я думаю, когда у вас есть одно действие, содержащее два фрагмента, вы легко узнаете, какой фрагмент в настоящее время виден и где вам нужно обновлять данные. Ниже приведена ссылка о реализации интерфейса для связи между активностью и фрагментом.
https://google-developer-training.gitbooks.io/android-developer-advanced-course-practicals/unit-1-expand-the-user-experience/lesson-1-fragments/1-2-p-communicating- с-фрагмент/1-2-п-связь-с-fragment.html
Надеюсь, поможет!
Ответ 4
Я искал нечто подобное, это помогло мне тогда. динамически обновлять список с помощью адаптера
В дополнение к этому вы должны передавать данные с помощью пакетов, интерфейса или намерений