我如何使用选项卡标题从 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("","");
}
}
确保您的 getPageTitles
和 getCount
匹配
例如
@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");
虽然这可能不是最有效的方法,但它很容易显示,您可以使用数据结构来保存什么用户类型有什么选项卡,并且可能有更优化的组织条件的方法。
我正在尝试使用 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("","");
}
}
确保您的 getPageTitles
和 getCount
匹配
例如
@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");
虽然这可能不是最有效的方法,但它很容易显示,您可以使用数据结构来保存什么用户类型有什么选项卡,并且可能有更优化的组织条件的方法。