Обновить фрагмент при перезагрузке


на android приложение я загружаю данные из Db на TableView внутри Fragment. Но когда я Reload the fragment он отображает предыдущие данные. Могу ли я повторно заселить Fragment с текущими данными вместо предыдущих данных?

9 70

9 ответов:

Я думаю, что вы хотите обновить содержимое фрагмента при обновлении БД

Если это так, отсоедините фрагмент и переклеивать

// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();

Your_Fragment_TAG-это имя, которое вы дали своему фрагменту при его создании

этот код предназначен для поддержки библиотеки.

Если вы не поддерживать старые устройства, просто используйте getFragmentManager вместо getSupportFragmentManager

[EDIT]

этот метод требует, чтобы фрагмент имел тег.
В случае, если у вас его нет, то метод @Hammer-это то, что вам нужно.

это обновит текущий фрагмент:

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(this).attach(this).commit();

в случае, если у вас нет тега фрагмента, следующий код хорошо работает для меня.

Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
 FragmentTransaction fragTransaction =   (getActivity()).getFragmentManager().beginTransaction();
 fragTransaction.detach(currentFragment);
 fragTransaction.attach(currentFragment);
 fragTransaction.commit();}
}

вы не можете перезагрузить фрагмент, пока он прикреплен к действию, где вы получаете"Fragment Already Added" исключение.

getFragmentManager().beginTransaction().detach(this).attach(this).commit();

обновление: Это должно включать изменения, внесенные в API 26 и выше:

FragmentTransaction transaction = mActivity.getFragmentManager()
                        .beginTransaction();
                if (Build.VERSION.SDK_INT >= 26) {
                    transaction.setReorderingAllowed(false);
                }
                transaction.detach(this).attach
                        (this).commit();

для более подробного описания обновления см. https://stackoverflow.com/a/51327440/4514796

использовать ContentProvider и загрузить данные с помощью "CursorLoader". С помощью этой архитектуры ваши данные будут автоматически перезагружены при изменении базы данных. Используйте сторонние структуры для ContentProvider - вы действительно не хотите реализовать его самостоятельно...

   MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
        getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();

это будет работать только если вы используете FragmentManager для инициализации фрагмента. Если у вас есть это как <fragment ... /> в XML, он не будет вызывать onCreateView еще раз. Потратил свои 30 минут, чтобы понять это.

у меня была та же проблема, но ни один из вышеперечисленных не работал для моего. либо была проблема с backstack (после загрузки, когда пользователь нажал назад, он снова должен был пойти на тот же фрагмент), либо он не вызывал onCreaetView

наконец я сделал это:

public void transactFragment(Fragment fragment, boolean reload) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    if (reload) {
        getSupportFragmentManager().popBackStack();
    }
    transaction.replace(R.id.main_activity_frame_layout, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

хороший момент - вам не нужен тег или идентификатор фрагмента. если вы хотите перезагрузить

вы можете обновить фрагмент, когда он виден пользователю, просто добавьте этот код в свой фрагмент, это обновит ваш фрагмент, когда он будет виден.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Refresh your fragment here          
  getFragmentManager().beginTransaction().detach(this).attach(this).commit();
        Log.i("IsRefresh", "Yes");
    }
}
protected void onResume() {
        super.onResume();
        viewPagerAdapter.notifyDataSetChanged();
    }

написать viewpagerAdapter.notifyDataSetChanged (); в onResume () в MainActivity. Удачи:)