Обновление фрагмента не работает - PullRequest
0 голосов
/ 21 мая 2018

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

У меня есть действие, в котором есть два 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);
    }

Ответы [ 4 ]

0 голосов
/ 30 мая 2018

Я искал что-то подобное, это помогло мне тогда. динамически обновлять представление списка с помощью адаптера

В дополнение к этому вы должны передавать данные с использованием пакетов, интерфейса или намерений

0 голосов
/ 24 мая 2018

Мне удалось решить эту проблему, добавив следующие методы:

Вкл. 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();
        }
    }
0 голосов
/ 26 мая 2018

Для связи от фрагмента к фрагменту через единственное действие было бы возможно через интерфейсы, или я должен сказать обратные вызовы.Я думаю, что, реализовав интерфейс в своей деятельности, вы могли бы общаться как с фрагментами, так и когда вызывается прослушиватель во фрагменте, вы могли бы выполнить действие соответствующим образом.То, что я думаю, когда у вас есть одно действие, содержащее два фрагмента, вы легко узнаете, какой фрагмент в настоящее время виден и где вы должны обновить данные.Ниже приведена ссылка о реализации интерфейса для взаимодействия между действием и фрагментом.

https://google -developer-training.gitbooks.io / android-developer-advanced-course-Practics / unit-1-expand-заместитель пользовательского опыта / урок-1-фрагменты / 1-2-п-связь-с-фрагментом / 1-2-п-связь-с-fragment.html

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

0 голосов
/ 21 мая 2018

Вы должны общаться со вторым фрагментом через деятельность.Когда вы делаете что-то в одном фрагменте, что должно повлиять на второй, вы должны вызвать в своей деятельности какой-то метод, который вызовет метод обновления во втором фрагменте.Так, например, деятельность:

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();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...