我最初使用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),因为我不希望我的其他片段在他们带回来时重新加载。
感谢。
答案 0 :(得分:0)
你应该改变这个方法
@Override
public int getCount() {
return numberOfFragmentsToShow;
}
numberOfFragmentsToShow
是您想要显示更多/更少片段时更改的int
变量
保留对SmallViewPagerAdapter
实例的引用,当您链接片段数时,请务必致电smallViewPagerAdapterInstance.notifyDataSetChanged();
以使更改生效。
或者,您可以添加/删除片段的arraylist中的项目,但是您必须调用smallViewPagerAdapterInstance.notifyDataSetChanged();
才能看到更改。
答案 1 :(得分:0)
我找到的解决方案是在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的当前所选页面。
注意:我知道这是一个不好的方法,但我能找到解决问题的方法。如果有人有更好的想法或认为这种方法不是更好,请告诉我。
答案 2 :(得分:0)
动态地在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);
}
}