【问题标题】:How can I return fragments from Android PagerAdapter using the tab titles如何使用选项卡标题从 Android PagerAdapter 返回片段
【发布时间】:2020-02-22 12:16:27
【问题描述】:

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

示例:

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

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

所以我在考虑是否可以根据标签页头返回片段。

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

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

标签页眉:

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

卖家:资料、产品、设置

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

问题:

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

谢谢。

【问题讨论】:

  • 如果您显示您已经拥有的代码,帮助您修复它会更容易。
  • 我已经用一些代码和对我的问题的更多解释更新了问题

标签: android android-studio android-fragments android-viewpager android-pageradapter


【解决方案1】:

您只需使用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");

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

【讨论】:

  • 哇,谢谢。那应该行得通。感谢您的精彩解释。我会尝试一下并使其成为公认的答案
  • 好的,这解决了我的问题。但是如果选项卡是动态的,即可能是基于用户从 db.load 加载的运动列表。那我们怎样才能做到这一点呢?
  • 这是一个不同的问题,但总体上是一个相似的答案,您的适配器需要根据给定的输入做出决定。您可以将标签标题的ArrayList 传递给它。 getCount 将返回 ArrayList 的大小,getPageTitle 将返回 position 处的 ArrayList 的内容,getItem 将有一个条件表示 - 如果此 position 的标签标题为“配置文件”,则返回 ProfileFragment .newInstance("",""); - 等等。然后您可以在创建适配器并将其传递给之前从数据库创建 ArrayList。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多