我如何使用选项卡标题从 Android PagerAdapter return 片段

How can I return fragments from Android PagerAdapter using the tab titles

我正在尝试使用 android 的视图寻呼机根据用户配置文件类型动态加载一些片段。但是 view-pager returns 片段基于位置。下面是描述我的问题的示例。

示例:

如果用户是免费用户,只有“个人资料”和“设置”选项卡是 shown.But 当管理员用户登录时,他将有 4 个额外的选项卡以及上述两个选项卡。 (设置选项卡现在被推到最后一项。)

我试图通过将选项卡 header 存储在 array-list 中并根据用户 type.By 设置选项卡 header 来实现这一点,我能够显示选项卡 header 根据用户类型正确,但现在片段 return 编辑不正确。

所以我在想我是否可以 return 基于标签 header 的片段 header。

我怎样才能正确地实施它?

PS :我有大约 4 种具有不同页面的用户类型。

代码:

PagerAdapter:

@Override
public Fragment getItem(int position) {
    switch (position){
        case 0:
            return ProfileFragment.newInstance("","");
        case 1:
            return ManageOrdersFragment.newInstance("","");
        case 2:
            return ManageSellers.newInstance("","");
        case 3:
            return ProductsFragment.newInstance("","");
        case 4:
            return SettingsFragment.newInstance("","");
        default:
            return ProfileFragment.newInstance("","");
    }
}

TabHeaders:

普通用户:配置文件、设置

卖家:资料、产品、设置

管理员:个人资料、订单、卖家、设置

问题:

此处选项卡 headers 已正确填充,但第二个选项卡的片段 returned 是普通用户的管理订单页面,它应该是设置。我知道它将制表符的位置设为 return 片段。如果有人能帮我解决这个问题,那将非常有帮助。

谢谢。

您只需要使用 if 或其他 switch

根据用户类型更改返回的内容

例如


@Override
public Fragment getItem(int position) {
  if ( getUserType().equals("admin"){
    switch (position){
        case 0:
            return ProfileFragment.newInstance("","");
        case 1:
            return ManageOrdersFragment.newInstance("","");
        case 2:
            return ManageSellers.newInstance("","");
        case 3:
            return SettingsFragment.newInstance("","");
        default:
            return ProfileFragment.newInstance("","");
    }
  } else if (getUserType().equals("seller"){
     switch (position){
        case 0:
            return ProfileFragment.newInstance("","");
        case 1:
            return ProductsFragment.newInstance("","");
        case 2:
            return SettingsFragment.newInstance("","");
        default:
            return ProfileFragment.newInstance("","");
  } else {
     switch (position){
        case 0:
            return ProfileFragment.newInstance("","");
        case 1:
            return SettingsFragment.newInstance("","");
        default:
            return ProfileFragment.newInstance("","");
  }
}

确保您的 getPageTitlesgetCount 匹配

例如


@Override
public CharSequence getPageTitle(int position) {
  if ( getUserType().equals("admin"){
    switch (position){
        case 0:
            return "Profile";
        case 1:
            return "Orders;
        case 2:
            return "Sellers;
        case 3:
            return "Settings";
        default:
            return "Profile";
    }
  } else if (getUserType().equals("seller"){
    switch (position){
        case 0:
            return "Profile";
        case 1:
            return "Products";
        case 2:
            return "Settings";
        default:
            return "Profile";
  } else {
     switch (position){
        case 0:
            return "Profile";
        case 1:
            return "Settings";
        default:
            return "Profile";
  }

@Override
public int getCount() {
  if ( getUserType().equals("admin"){
    return 4;
  } else if (getUserType().equals("seller"){
    return 3;
  } else {
    return 2;
  }
}

在这种情况下,方法 getUserType() returns 一个匹配您的用户类型的字符串,但您可能已经以某种方式存储了该字符串,因此请调整以匹配。 如果您还没有易于访问的东西,您可以调整 Adapter 的构造函数以获取额外的参数

例如

class ViewPagerAdapter extends FragmentStatePagerAdapter {
   private String userType;


        ViewPagerAdapter(FragmentManager fm, String userType) {
            super(fm);
            this.userType = userType;
        }
 ......

然后在创建适配器时

mViewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(),"admin");

虽然这可能不是最有效的方法,但它很容易显示,您可以使用数据结构来保存什么用户类型有什么选项卡,并且可能有更优化的组织条件的方法。