簡體   English   中英

使用FragmentPagerAdapter在viewpager中添加/刪除片段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM