繁体   English   中英

如何使用选项卡标题从 Android PagerAdapter 返回片段

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

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

例子 :

如果用户是免费用户,则只显示“配置文件”和“设置”选项卡。但是当管理员用户登录时,他将有 4 个额外的选项卡以及上述两个选项卡。 (设置选项卡现在被推到最后一个项目。)

我试图通过将选项卡标题存储在数组列表中并根据用户类型设置选项卡标题来实现这一点。通过这种方式,我能够根据用户类型正确显示选项卡标题,但现在错误地返回了片段。

所以我在想是否可以根据选项卡标题返回片段。

我该如何正确实施?

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

代码 :

寻呼机适配器:

@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("","");
    }
}

标签标题:

一般用户:个人资料,设置

卖家:个人资料、产品、设置

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

问题:

这里选项卡标题已正确填充,但为第二个选项卡返回的片段是一般用户的 ManageOrders 页面,它应该是设置。 我知道返回片段需要标签的位置。 如果有人能帮我解决这个问题,那真的很有帮助。

谢谢你。

您只需要使用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()返回一个字符串以匹配您的用户类型,但您可能已经以某种方式存储了该字符串,因此请调整以匹配。 如果您已经没有容易访问的东西,您可以调整您的适配器的构造函数以获取额外的参数

例如

class ViewPagerAdapter extends FragmentStatePagerAdapter {
   private String userType;


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

然后在创建适配器时

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM