Обновление фрагмента не работает

Я изучаю Android, и, пытаясь разработать приложение, я столкнулся со следующей ситуацией:

У меня есть Activity, который имеет два Fragments: ReminderListFragment и FilterListFragment. Первый фрагмент имеет список напоминаний, а второй - список фильтров с именем и количеством элементов, зарегистрированных в каждом фильтре. Однако, когда я исключаю некоторое напоминание, значения FilterListFragment не обновляются. То же самое происходит, когда я удаляю один из фильтров (в этом случае он удаляет все записи для выбранного фильтра), он не обновляет список напоминаний.

enter image description here

Код 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

Надеюсь, поможет!