[英]How to refresh a Fragment of a FragmentPagerAdapter?
I have got 2 tabs called tab1 (home) and tab2 (profile) using TabPageIndicator
and FragmentPagerAdapter
libraries. 我有两个标签名为tab1(home)和tab2(profile),使用
TabPageIndicator
和FragmentPagerAdapter
库。
In tab2, I have a button named "Log in" (tab2 inflates abc.xml
). 在tab2中,我有一个名为“登录”的按钮(tab2膨胀
abc.xml
)。
When users click "log in" button, the app will show a login form in a new activity. 当用户单击“登录”按钮时,应用程序将在新活动中显示登录表单。 After logging in, the activity finishes and the content view of tab2 will change ( it shows user's profile because it will inflate
xyz.xml
). 登录后,活动结束,tab2的内容视图将更改(它显示用户的配置文件,因为它会使
xyz.xml
膨胀)。 How can I do that? 我怎样才能做到这一点?
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();
}
}
}
You can use FragmentStatePagerAdapter instead of FragmentPagerAdapter
您可以使用FragmentStatePagerAdapter而不是FragmentPagerAdapter
You can try like this: 你可以尝试这样:
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);
}
Reference
参考
You can use startActivityForResult(or broadcast/receiver) to get the result from the activity. 您可以使用startActivityForResult(或广播/接收器)从活动中获取结果。 Then use adapter.notifyDataSetChanged to refresh the fragment.
然后使用adapter.notifyDataSetChanged刷新片段。
About refreshing the ViewPager, more detail: 关于刷新ViewPager,更多细节:
ViewPager PagerAdapter not updating the View ViewPager PagerAdapter未更新视图
I've tried a lot of solutions i found in google and stackoverflow about this problem. 我已经尝试了很多解决方案,我在google和stackoverflow中发现了这个问题。 All of them did not work correctly.
所有这些都无法正常工作。 Also tutorials in official google android developer pages didn't work.
官方谷歌Android开发者页面中的教程也不起作用。
I implemented ViewPageIndicator to my application and tried to create an imageslider. 我将ViewPageIndicator实现到我的应用程序并尝试创建一个imageslider。 I have dynamic urls for images comes from on service callback success.
我有动态网址,图片来自服务回调成功。 So i have to set my viewpager adapter and indicator in OnResume.
所以我必须在OnResume中设置我的viewpager适配器和指示器。 When i set everything was ok i load fragments in onResume and after OnStop i reload them.
当我设置一切正常时,我在onResume中加载片段,然后在OnStop上重新加载它们。 But when i send app to background and open some other apps i realized after onResume my slider cant reload images.
但是,当我将应用程序发送到后台并打开一些其他应用程序后我意识到onResume我的滑块无法重新加载图像。
After wasting my time, i tried to understand lifecyle of fragments which i created in fragmentpageradapter getItem clearly with logging and debugging onCreateView and onResume events. 浪费了我的时间之后,我试图通过记录和调试onCreateView和onResume事件来清楚地了解我在fragmentpageradapter getItem中创建的片段的生命周期。
If you create your fragments like 如果你创建你的片段
Fragment myFragment = new Fragment(url,position);
After you stop your activity and open some other applications, you loose your vars which you set on constructor of your custom fragment. 停止活动并打开其他一些应用程序后,您将丢失在自定义片段的构造函数上设置的变量。 When i realized this situation i tried bundle approach.
当我意识到这种情况时,我尝试捆绑方法。
Here is my custom FragmentPagerAdapter (I used google's sample) 这是我的自定义FragmentPagerAdapter(我使用谷歌的样本)
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();
}
}
My custom FragmentPagerAdapter implements IconPagerAdapter. 我的自定义FragmentPagerAdapter实现了IconPagerAdapter。 Be careful about that.
小心一点。
And my custom SliderFragment: 我的自定义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;
}
And finally my loadSlider method which loads slider items 最后我的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();
}
I could not have chance to check if my slider fragments are being updated but at least fragments live after OnStop and thats what i needed most. 我无法检查我的滑块是否正在更新,但至少片段是在OnStop之后生存的,这就是我最需要的。
I was also facing the same issue, So i resolved it on my way: 我也遇到了同样的问题,所以我在途中解决了这个问题:
Just refresh your HomeFragment or ProfileFragment by overriding onResume method. 只需重写onResume方法即可刷新HomeFragment或ProfileFragment。
In onResume Method you can refresh your ListFragment or Fragment easily. 在onResume方法中,您可以轻松刷新ListFragment或Fragment。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.