如何刷新 FragmentPagerAdapter 的片段?
Posted
技术标签:
【中文标题】如何刷新 FragmentPagerAdapter 的片段?【英文标题】:How to refresh a Fragment of a FragmentPagerAdapter? 【发布时间】:2013-09-13 15:07:47 【问题描述】:我使用 TabPageIndicator
和 FragmentPagerAdapter
库有 2 个选项卡,名为 tab1(主页)和 tab2(配置文件)。
在 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();
【问题讨论】:
你试过FragmentStatePagerAdapter
吗?
不,我没有,你能告诉我如何使用它吗?请编辑我上面的代码。
尝试将 TabsAdapter
扩展到 FragmentStatePagerAdapter
而不是 FragmentPagerAdapter
。所以它会像class TabsAdapter extends FragmentStatePagerAdapter
好吧,在完成登录活动之后。为了将 abc.xml 切换到 xyz.xml 我必须做什么?
【参考方案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);
参考
您可以查看this解决方案。
【讨论】:
感谢您的警告@GhostCat 感谢您处理我的反馈的完美方式 ;-)【参考方案2】:您可以使用 startActivityForResult(或广播/接收器)从活动中获取结果。 然后使用 adapter.notifyDataSetChanged 刷新片段。
关于刷新 ViewPager,更详细:
ViewPager PagerAdapter not updating the View
【讨论】:
【参考方案3】:我也遇到了同样的问题,所以我在路上解决了:
只需通过重写 onResume 方法来刷新您的 HomeFragment 或 ProfileFragment。
在 onResume 方法中,您可以轻松刷新 ListFragment 或 Fragment。
【讨论】:
【参考方案4】:我已经尝试了很多我在 google 和 *** 中找到的关于这个问题的解决方案。他们都没有正常工作。官方谷歌安卓开发者页面中的教程也不起作用。
我在我的应用程序中实现了 ViewPageIndicator 并尝试创建一个图像滑块。我有图像的动态网址来自服务回调成功。所以我必须在 OnResume 中设置我的 viewpager 适配器和指示器。当我设置一切正常时,我在 onResume 中加载片段,在 OnStop 之后我重新加载它们。但是当我将应用程序发送到后台并打开其他一些应用程序时,我意识到在 onResume 之后我的滑块无法重新加载图像。
在浪费我的时间之后,我试图通过记录和调试 onCreateView 和 onResume 事件来清楚地了解我在 fragmentpageradapter getItem 中创建的片段的生命周期。
如果你像
这样创建你的片段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 之后存在,这就是我最需要的。
【讨论】:
以上是关于如何刷新 FragmentPagerAdapter 的片段?的主要内容,如果未能解决你的问题,请参考以下文章
使用 FragmentPagerAdapter 时如何获取现有片段
如何从 FragmentPagerAdapter 返回多个片段
如何在 FragmentPagerAdapter 中添加片段标签以便稍后引用片段?
如何在 PagerAdapter 中返回多个片段(不是 FragmentPagerAdapter)