Метод onCreateView() не вызывается для фрагмента, содержащего recyclerView. Я использую FragmentStatePagerAdapter в качестве ViewPagerAdapter

У меня есть два фрагмента.

1) Фрагмент только с TextView(OneFragment)

2) Фрагмент с представлением переработчика, содержимое которого заполняется в onCreateView() фрагмента (два фрагмента)

В классе Activity я использую viewPager для управления этими фрагментами!!

Однако я столкнулся с проблемой.

Метод onCreateView() объекта TwoFragment вызывается при первой загрузке активности! Когда я перехожу к другим фрагментам и возвращаюсь обратно к двум фрагментам, метод onCreateView() не вызывается.

Вместо того, чтобы показывать мне recyclerView, он отображает пустой экран! Однако, когда я меняю ориентацию устройства! Вызывается onCreateView(), и список заполняется!

Я хочу, чтобы он показывал TwoFragment, возвращаясь к нему.

Однако у OneFragment нет проблем с этим! Каждый раз, когда я возвращаюсь к нему, отображается обычный большой текстовый вид!

Вот код для моего адаптера ViewPager

    class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager manager) {
    super(manager);
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}


@Override
public int getItemPosition(Object object){
   // return PagerAdapter.POSITION_NONE;
    Fragment f = (Fragment) object;
    for(Fragment frag: mFragmentList){
      return frag.getTagInt();
    }
    return FragmentStatePagerAdapter.POSITION_NONE;

}

@Override
public int getCount() {

    return mFragmentList.size();
}

public void addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);

}

public void clearAll(){
    mFragmentList.clear();
    mFragmentTitleList.clear();
    notifyDataSetChanged();
}

@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}

}

И я установил адаптер ViewPager следующим образом:

      private void setupViewPager(ViewPager viewPager,int choice) {
    if(choice == 1){
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.clearAll();
        adapter.addFragment(new OneFragment(), "One");
        adapter.addFragment(new TwoFragment(), "Two");
        viewPager.setAdapter(adapter);

    }
    else{
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.clearAll();
        adapter.addFragment(new OneFragment(), "One");
        adapter.addFragment(new OneFragment(), "Two");
        viewPager.setAdapter(adapter);


    }

}

и вот мой предыдущий getItemId()

     @Override
public int getItemPosition(Object object){
   // return PagerAdapter.POSITION_NONE;
    Fragment f = (Fragment) object;
    for(int i=0;i<getCount();i++){
        Fragment fragment = getItem(i);
        if(f.equals(fragment)){
            return i;
        }
    }
    return FragmentStatePagerAdapter.POSITION_NONE;

}

Любая помощь очень ценится! Потому что я немного застрял после посещения Интернета и stackOverflow!!




Ответы (1)


Вы не должны возвращать POSITION_NONE в getItemPosition() для каждого запроса. POSITION_NONE означает, что вы сообщаете адаптеру пейджера, что этот конкретный фрагмент удален из списка и, пожалуйста, соответствующим образом измените страницы/фрагменты. Когда вы вернете это, адаптер удалит фрагмент из своего личного списка фрагментов. Это возвращается, когда вы хотите удалить фрагмент.

Отправьте позицию фрагмента, используя метод indexof интерфейса списка.

Дополнительную информацию см. в этой публикации.

person cgr    schedule 24.11.2015
comment
Я изменил свой код getItemPosition(), но проблема осталась! Я обновил свой код!! Тем не менее проблема сохраняется! Что-нибудь, что я сделал не так? - person Jason Bakthakumar; 25.11.2015
comment
Не рекомендуется использовать getItem() в вашем коде. Это должно вызываться только фреймворком. почему вы не можете просто использовать индекс метода из интерфейса списка. Я не уверен, что ваши equals() работают, как вы ожидали здесь. Я думаю, что это не так. - person cgr; 25.11.2015
comment
Я изменил метод getItem() и заставил его работать!! Я только что понял, что onCreateView() действительно вызывается! Но recyclerView не заполняется! Я также попытался инициализировать адаптер в методе onCreate() фрагмента! Только если я изменю ориентацию экрана, он будет заполнен и показан! Любой sloution для этого! - person Jason Bakthakumar; 25.11.2015
comment
Вы имеете в виду метод getItem() или удалили getItem() из getItemPosition()? - person cgr; 25.11.2015
comment
Я имею в виду, что я удалил метод getItem() из getItemPosition() и использовал теги во фрагментах, чтобы решить эту проблему!! - person Jason Bakthakumar; 25.11.2015
comment
Он отлично работает для всех остальных фрагментов только с textView и ImageView! Но фрагмент с RecyclerView работает некорректно!! - person Jason Bakthakumar; 25.11.2015
comment
Могу ли я узнать, где теги помогли? В чем проблема сейчас? Все равно пусто что ли? Объясните подробно, и вы можете вставить соответствующий код, чтобы лучше понять. - person cgr; 25.11.2015
comment
Мне удалось решить проблему с ViewPager!! Но теперь я столкнулся с еще большей проблемой, когда другие фрагменты с обычным текстом и ImageView работают нормально! Но фрагмент с видом ресайклера не отображается, когда я возвращаюсь к нему!! - person Jason Bakthakumar; 25.11.2015
comment
Однако вид переработчика отображается, когда я меняю ориентацию! В журнале я получаю предупреждение о том, что метод requestLayout() неправильно вызывается NavigationMenu! !! - person Jason Bakthakumar; 25.11.2015
comment
Фрагмент с видом ресайклера не отображается при смахивании назад с другого фрагмента - это проблема, с которой вы когда-либо сталкивались. Теперь - он показывает пустой экран или вообще не показывает экран? Вставьте измененный getItemPosition(). - person cgr; 25.11.2015
comment
Что касается onCreateView() recyclerViewFragment! Приложение идет туда !! Я нашел это с помощью оператора Log()!! Так что реальная проблема кроется во фрагменте с recyclerView!! - person Jason Bakthakumar; 25.11.2015
comment
Конечно Уилл!! getItemPosition()!! и показывает пустой экран! я вижу пустой экран - person Jason Bakthakumar; 25.11.2015
comment
Не изменяйте существующий код. Это смутит ребят, которые прочитают этот пост позже... добавьте к существующему вопросу. - person cgr; 25.11.2015
comment
Я тут новенький! Не учел!! Сделал это!! Любое предложение брат!!! Потому что я застрял !! Любая помощь приветствуется! - person Jason Bakthakumar; 25.11.2015
comment
Я думаю, что вы снова ошиблись с getItemPosition. Тег int - это просто позиция фрагмента? - person cgr; 25.11.2015
comment
Может ли пользователь динамически добавлять или удалять любую страницу (фрагмент) из пейджера? Если нет, замените свой код на этот: верните mFragmentList.indexof (объект) и посмотрите. - person cgr; 25.11.2015
comment
Пользователь может динамически добавлять и удалять страницы из представления Пейджер для изменения представления!! И indexOf() не работает! Только что попробовал! До сих пор не работает !! - person Jason Bakthakumar; 25.11.2015
comment
с вашим тегом, вы просто убедитесь, что он возвращает правильную позицию. Поместите оператор журнала и посмотрите, возвращается ли он в правильное положение, когда вы проводите пальцем. Убедитесь, что мы можем сузить анализ. Попробуйте со всеми доступными решениями. - person cgr; 25.11.2015
comment
Не могли бы вы добавить комментарий выше? Мне было любопытно, если вы все еще боретесь. - person cgr; 01.12.2015
comment
Извините, что не могу вам сказать, сеть здесь! Я придумал обходной путь, братан!! у меня все хорошо!! Решил! Большое спасибо за ваш интерес и помощь!! @cgr... - person Jason Bakthakumar; 05.12.2015
comment
Это потрясающе. Добавьте свой ответ с решением. Наш, если вы думаете, что мой ответ помог проголосовать за него. .это будет полезно для кого-то. - person cgr; 05.12.2015
comment
Да Конечно будет!! Но нужно иметь 15 репутации, чтобы проголосовать :( :(... Сделаю, как только доберусь туда!! Еще раз спасибо!! - person Jason Bakthakumar; 05.12.2015