Как я могу вернуть фрагменты из Android PagerAdapter, используя заголовки вкладок - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь использовать пейджер просмотра 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("","");
    }
}

TabHeaders:

Обычный пользователь: профиль, настройки

Продавец: профиль, продукты, настройки

Администратор: Профиль, Заказы, Продавцы, Настройки

Проблема:

Здесь заголовки вкладок заполнены правильно, но фрагмент, возвращаемый для второй вкладки, является страницей ManageOrders для обычного пользователя. где должно быть Настройки. Я понимаю, что для возврата фрагмента требуется позиция вкладок. Было бы очень полезно, если бы кто-то мог помочь мне решить эту проблему.

Спасибо.

1 Ответ

1 голос
/ 22 февраля 2020

Вам просто нужно изменить то, что возвращается в зависимости от типа пользователя, используя 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 match

например,


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

Хотя это, вероятно, не самый эффективный способ сделать это, просто показать, что вы могли бы структурировать данные для хранения того, какой тип пользователя имеет, какие вкладки и, возможно, есть более оптимальные способы организации условных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...