Как обновить фрагмент FragmentPagerAdapter?

У меня есть 2 вкладки, называемые tab1 (home) и tab2 (профиль) с использованием библиотек TabPageIndicator и FragmentPagerAdapter .

В tab2 у меня есть кнопка с именем «Войти» (tab2 раздувает abc.xml ).

Когда пользователи нажмут кнопку «войти в систему», приложение отобразит форму входа в новую активность. После входа в систему действие завершается, и представление содержимого tab2 изменится (он показывает профиль пользователя, потому что он будет раздувать xyz.xml ). Как я могу это сделать?

 public class MainActivity extends SherlockFragmentActivity { private static String[] TAB_NAMES = null; private Context context = this; private static FragmentPagerAdapter adapter ; @Override protected void onCreate(Bundle savedInstanceState) { if (TAB_NAMES == null) { TAB_NAMES = new String[] { getResources().getString(R.string.tab_home), getResources().getString(R.string.tab_profile) }; } super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); adapter = new TabsAdapter( getSupportFragmentManager()); ViewPager pager = (ViewPager) findViewById(R.id.pager); pager.setAdapter(adapter); TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator); indicator.setViewPager(pager); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater infalter = getSupportMenuInflater(); infalter.inflate(R.menu.main_menu, menu); return true; } class TabsAdapter extends FragmentPagerAdapter { public TabsAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 0: return HomeFragment.getInstance(); case 1: return new ProfileFragment(); default: return HomeFragment.getInstance(); } } } 

Solutions Collecting From Web of "Как обновить фрагмент FragmentPagerAdapter?"

Вы можете использовать startActivityForResult (или широковещательную / приемную), чтобы получить результат от активности. Затем для обновления фрагмента используйте параметр adapter.notifyDataSetChanged.

О обновлении ViewPager, более подробно:

ViewPager PagerAdapter не обновляет вид

Я пробовал много решений, которые я нашел в google и stackoverflow об этой проблеме. Все они работали неправильно. Также учебные пособия на официальных страницах разработчиков Google Android не работали.

Я внедрил ViewPageIndicator в свое приложение и попытался создать imagelider. У меня есть динамические URL-адреса для изображений, полученных из успешного завершения обратного вызова службы. Так что я должен установить адаптер и индикатор viewpager в OnResume. Когда я устанавливал все, было нормально загружать фрагменты в onResume и после OnStop я перезагружаю их. Но когда я отправляю приложение на фон и открываю некоторые другие приложения, которые я понял после onResume, мой слайдер не может перезагружать изображения.

После того, как я потратил свое время, я попытался понять жизненный цикл фрагментов, которые я создал в fragpageradapter getItem, с записью и отладкой событий onCreateView и onResume.

Если вы создадите фрагменты наподобие

 Fragment myFragment = new Fragment(url,position); 

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

Вот мой пользовательский FragmentPagerAdapter (я использовал образец Google)

 public class ScreenSlidePageAdapter extends FragmentPagerAdapter implements IconPagerAdapter { ArrayList<String> urls; public ScreenSlidePageAdapter(ArrayList<String>urls,FragmentManager fm) { super(fm); this.urls = urls; fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } @Override public Fragment getItem(int position) { SliderFragment sliderFragment = new SliderFragment(); Bundle bundle = new Bundle(); bundle.putString("url",urls.get(position)); sliderFragment.setArguments(bundle); return sliderFragment; } @Override public int getIconResId(int index) { return R.drawable.notification_circle; } @Override public int getCount() { return this.urls.size(); } } 

Мой пользовательский FragmentPagerAdapter реализует IconPagerAdapter. Будьте осторожны.

И мой пользовательский SliderFragment:

 public class SliderFragment extends Fragment { private String url; private int position; private boolean clickable; public SliderFragment() { } public SliderFragment(String url, int position, boolean clickable) { this.url = url; //this.position = position; //this.clickable = clickable; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.layout_fragment_slider, container, false); this.url = getArguments().getString("url"); ImageView imageView = (ImageView) rootView.findViewById(R.id.iv_image); com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(Constants.URL_PREFIX + url, imageView); imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getActivity(),SliderActivity.class); intent.putExtra("url",url); startActivity(intent); getActivity().overridePendingTransition(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left); } }); return rootView; } 

И, наконец, мой метод loadSlider, который загружает элементы слайдера

 private void loadSlider() { pager = (ViewPager) findViewById(R.id.dealdetailpager); ScreenSlidePageAdapter screenSlidePageAdapter = new ScreenSlidePageAdapter(dealDetail.getImages(),getSupportFragmentManager()); pager.setAdapter(screenSlidePageAdapter); circlePageIndicator = (CirclePageIndicator) findViewById(R.id.indicator); circlePageIndicator.setViewPager(pager); sliderThread = new SliderThread(true, 0); sliderThread.start(); } 

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

Я также столкнулся с одной и той же проблемой, поэтому я решил это на своем пути:

Просто обновите свой HomeFragment или ProfileFragment, переопределив метод onResume.

В методе onResume вы можете легко обновить свой ListFragment или Fragment.