Как обновить фрагмент 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();
}
}
}
Ответы
Ответ 1
Вы можете использовать FragmentStatePagerAdapter вместо FragmentPagerAdapter
Вы можете попробовать следующее:
private static FragmentStatePagerAdapter adapter ;
private static String[] TAB_NAMES = null;
@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 FragmentStatePagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return HomeFragment.getInstance();
case 1:
return new ProfileFragment();
default:
return HomeFragment.getInstance();
}
}
@Override
public int getCount() {
return TAB_NAMES.length;
}
@Override
public int getItemPosition(Object fragItem) {
int position = 0;
if (fragItem instanceof HomeFragment) {
position = 0;
} else if (fragItem instanceof ProfileFragment) {
position = 1;
}
return (position >= 0) ? position : POSITION_NONE;
}
}
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
indicator.setViewPager(pager);
}
Ссылка
Вы можете проверить это решение.
Ответ 2
Вы можете использовать startActivityForResult (или широковещательный/ресивер), чтобы получить результат от активности.
Затем для обновления фрагмента используйте адаптер .notifyDataSetChanged.
Об обновлении ViewPager, более подробно:
ViewPager PagerAdapter не обновляет представление
Ответ 3
Я пробовал много решений, которые я нашел в google и stackoverflow об этой проблеме. Все они работали неправильно. Также учебные пособия на официальных страницах разработчиков Google Android не работали.
Я внедрил ViewPageIndicator в свое приложение и попытался создать imagelider. У меня есть динамические URL-адреса для изображений, полученных из успешного завершения обратного вызова службы. Поэтому я должен установить адаптер и индикатор Viewpager в OnResume. Когда я устанавливал все было нормально, я загружаю фрагменты в onResume и после OnStop я перезаряжаю их. Но когда я отправляю приложение на задний план и открываю некоторые другие приложения, которые я понял после onResume, мой слайдер не может перезагружать изображения.
После того, как я потратил свое время, я попытался понять жизненный цикл фрагментов, которые я создал в fragmentpageradapter getItem, с записью и отладкой событий onCreateView и onResume.
Если вы создадите свои фрагменты, например
Fragment myFragment = new Fragment(url,position);
После того, как вы остановите свою деятельность и откройте некоторые другие приложения, вы потеряете свои вары, которые вы установили в конструкторе вашего пользовательского фрагмента. Когда я понял эту ситуацию, я попробовал расслоение.
Вот мой пользовательский 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, и это то, что мне нужно больше всего.
Ответ 4
Я также столкнулся с одной и той же проблемой, поэтому я решил это на моем пути:
Просто обновите свой HomeFragment или ProfileFragment, переопределив метод onResume.
В onResume Method вы можете легко обновить свой список или фрагмент.