[英]Replace a Fragment in a ViewPager using FragmentPagerAdapter
[英]add/remove fragment in viewpager using FragmentPagerAdapter
我正在使用FragmentPagerAdapter最初加載4個片段。 現在我有另一個片段,我只想在單擊時顯示(例如,從其他片段內的按鈕中顯示),並且每次該片段出現在最前面時,都應在其中顯示新數據。 那么,現在我應該怎么做呢?
我的FragmentPagerAdapater
public class SmallViewPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> allFragments;
public SmallViewPagerAdapter(FragmentManager fm,
ArrayList<Fragment> allFragments) {
super(fm);
this.allFragments = allFragments;
}
@Override
public Fragment getItem(int position) {
return allFragments.get(position);
}
@Override
public int getCount() {
return allFragments.size();
} }
定義我的適配器並將其添加到viewpager
private ArrayList<Fragment> frags = new ArrayList<Fragment>();
private SmallViewPagerAdapter vpAdapter;
viewPager.setPagingEnabled(false);
viewPager.setOffscreenPageLimit(3);
frags.add(new MapContainerFragment(this));
frags.add(new FavoriteContainerFragment(this));
frags.add(new AllOffersFragment(this));
frags.add(new RegisterFragment(this));
vpAdapter = new SmallViewPagerAdapter(getSupportFragmentManager(),
frags);
viewPager.setAdapter(vpAdapter);
現在由於某種原因,我不得不放置setOffscreenPageLimit(3),因為我不希望我的其他片段帶回來時重新加載。
謝謝。
你應該改變這種方法
@Override
public int getCount() {
return numberOfFragmentsToShow;
}
numberOfFragmentsToShow
是一個int
變量,當您想顯示更多/更少的片段時可以更改
保留對SmallViewPagerAdapter
實例的SmallViewPagerAdapter
並且在鏈接片段數時,請確保調用smallViewPagerAdapterInstance.notifyDataSetChanged();
使更改生效。
或者,您可以從片段的smallViewPagerAdapterInstance.notifyDataSetChanged();
添加/刪除項目,但是必須調用smallViewPagerAdapterInstance.notifyDataSetChanged();
看看變化。
好吧,我為此找到的解決方案是在初始化viewpager時添加我的5個片段
private ArrayList<Fragment> frags = new ArrayList<Fragment>();
private SmallViewPagerAdapter vpAdapter;
viewPager.setPagingEnabled(false);
viewPager.setOffscreenPageLimit(4);
frags.add(new MapContainerFragment(this));
frags.add(new FavoriteContainerFragment(this));
frags.add(new AllOffersFragment(this));
frags.add(new RegisterFragment(this));
frags.add(new DetailFragment(this));
vpAdapter = new SmallViewPagerAdapter(getSupportFragmentManager(),
frags);
viewPager.setAdapter(vpAdapter);
並創建了一個靜態函數,用於在每次點擊時更新視圖
public static void updateView(Context context, String offerId) {
offer = new DBHandler(context).getOffersById(offerId);
if (offer != null) {
offerName.setText(offer.getTitle());
offerSave.setText(offer.getListTitle());
ImageLoader.getInstance().displayImage(
Constants.URLHelper.getUrlForOfferImage(offer.getId(),
offer.getLogoId()), offerImage);
detailText.setText(Html.fromHtml(offer.getDetailDesc().replace(
"COLOR=\"#0B333C\"", " ")));
} else {
Toast.makeText(context, "No Offer detail found!!",
Toast.LENGTH_LONG).show();
}
}
然后在按鈕上單擊“我”,即可更改viewpager的當前選定頁面。
注意:我知道這是一個不好的方法,但這就是解決問題的全部方法。 如果有人有更好的主意或認為這種方法不好,請告訴我。
在viewpager中動態添加或刪除片段:
setupViewPager(viewPager)
。 要加載其他片段,請調用setupViewPagerCustom(viewPager)
:
private void setupViewPager(ViewPager viewPager)
{
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFrag(new fragmnet1(), "HOME");
adapter.addFrag(new fragmnet2(), "SERVICES");
viewPager.setAdapter(adapter);
}
private void setupViewPagerCustom(ViewPager viewPager)
{
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFrag(new fragmnet3(), "Contact us");
adapter.addFrag(new fragmnet4(), "ABOUT US");
viewPager.setAdapter(adapter);
}
//Viewpageradapter, handles the views
static class ViewPagerAdapter extends FragmentStatePagerAdapter
{
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager){
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
public void addFrag(Fragment fragment, String title){
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position){
return mFragmentTitleList.get(position);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.