[英]How to refresh a Fragment of a FragmentPagerAdapter?
我有兩個標簽名為tab1(home)和tab2(profile),使用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();
}
}
}
您可以使用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);
}
參考
您可以查看此解決方案。
您可以使用startActivityForResult(或廣播/接收器)從活動中獲取結果。 然后使用adapter.notifyDataSetChanged刷新片段。
關於刷新ViewPager,更多細節:
我已經嘗試了很多解決方案,我在google和stackoverflow中發現了這個問題。 所有這些都無法正常工作。 官方谷歌Android開發者頁面中的教程也不起作用。
我將ViewPageIndicator實現到我的應用程序並嘗試創建一個imageslider。 我有動態網址,圖片來自服務回調成功。 所以我必須在OnResume中設置我的viewpager適配器和指示器。 當我設置一切正常時,我在onResume中加載片段,然后在OnStop上重新加載它們。 但是,當我將應用程序發送到后台並打開一些其他應用程序后我意識到onResume我的滑塊無法重新加載圖像。
浪費了我的時間之后,我試圖通過記錄和調試onCreateView和onResume事件來清楚地了解我在fragmentpageradapter getItem中創建的片段的生命周期。
如果你創建你的片段
Fragment myFragment = new Fragment(url,position);
停止活動並打開其他一些應用程序后,您將丟失在自定義片段的構造函數上設置的變量。 當我意識到這種情況時,我嘗試捆綁方法。
這是我的自定義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();
}
}
我的自定義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之后生存的,這就是我最需要的。
我也遇到了同樣的問題,所以我在途中解決了這個問題:
只需重寫onResume方法即可刷新HomeFragment或ProfileFragment。
在onResume方法中,您可以輕松刷新ListFragment或Fragment。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.