Проблемы с обновлением фрагментов в Android FragmentPagerAdapter [дубликат]

Я столкнулся с этой ошибкой entityForName: nil, но в итоге это была красная селедка, которая проявлялась только при выполнении модульных тестов на моем CI. Во время тестирования приложение столкнулось с некоторыми странными условиями потоковой передачи, вызванными HTML-импортером NSAttributedString . Асинхронная отправка в основную очередь для взаимодействия с Core Data происходила так же, как создавался файл NSAttributedString из HTML.

Просто опубликуйте мой опыт здесь, если он окажется полезным для кого-то другого. :) [/ Д2]

3
задан Daniel Nugent 8 April 2016 в 19:12
поделиться

2 ответа

Использование ViewPager.OnPageChangeListener - правильный путь, но вам нужно будет немного реорганизовать ваш адаптер, чтобы сохранить ссылку на каждый фрагмент, содержащийся в FragmentPagerAdapter.

Вы используете это, используя [#]

 class PagerAdapter extends FragmentPagerAdapter {
        String tabTitles[] = new String[] { "One", "Two", "Three", "Four"};
        Context context;

        //This will contain your Fragment references:
        public Fragment[] fragments = new Fragment[tabTitles.length];

        public PagerAdapter(FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
        }
        @Override
        public int getCount() {
            return tabTitles.length;
        }
        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return new FragmentOne();
            case 1:
                return new FragmentTwo();
            case 2:
                return new FragmentThree();   
            case 3:
                return new FragmentFour();
            }
            return null;
        }

        //This populates your Fragment reference array:
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
            fragments[position]  = createdFragment;
            return createdFragment;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            // Generate title based on item position
            return tabTitles[position];
        }         
 }

Затем вместо создания нового фрагмента используйте тот, который содержится в адаптере:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }

  @Override
  public void onPageSelected(int position) {

        // do this instead, assuming your adapter reference
        // is named mAdapter:
        Fragment frag = mAdapter.fragments[position];
        if (frag != null && frag instanceof FragmentTwo) {
          ((FragmentTwo)frag).sendGetRequest();
        }
  }

  @Override
  public void onPageScrollStateChanged(int state) {  }
});

Обратите внимание: если вы используете разные классы фрагментов в своем адаптере, вы можете реализовать интерфейс, который определяет sendGetRequest(), а в каждом из ваших классов фрагментов реализует метод sendGetRequest ().

Если вы не идете с интерфейсом, вам нужно будет отбросить фрагмент к вашему собственному типу фрагмента, как показано в примере выше, то есть:

if (frag instanceof FragmentTwo) {
    ((FragmentTwo)frag).sendGetRequest();
}
3
ответ дан Daniel Nugent 17 August 2018 в 16:02
поделиться
  • 1
    спасибо Даниэлю Нугенту. для вашего полного ответа. есть проблема: & lt; br / & gt; mAdapter.fragments[CurrentPossition]; возвращает Фрагмент , но мое желание - fragment_two , которое простирается от фрагмента, Как я могу передать его в fragment_two – Mohamad Armoon 8 April 2016 в 16:47
  • 2
    снова я получаю ту же ошибку, я использовал FragmentStatePagerAdapter, я изменил ее на FragmentPagerAdapter, но снова NullPoiterException. – Mohamad Armoon 8 April 2016 в 18:45
  • 3
    ваш подход действительно сработал, благодаря большому помощнику. – Mohamad Armoon 8 April 2016 в 18:56

Вместо вызова метода sendGetRequest () в прослушивателе просмотра пейджера, вызовите свой запрос GET в методе onCreateView в вашем фрагменте фрагмента class_two. Причина этого заключается в том, что вы гарантируете, что все ваши представления в фрагментаторе были правильно инициализированы через события жизненного цикла фрагмента.

0
ответ дан Anthony Ng 17 August 2018 в 16:02
поделиться
  • 1
    как я упомянул в первом подходе, все хорошо работало, когда я использовал sendGetRequest () в onCreateView или setUserVisibleHint, проблема в этом случае была непростой. это отсутствие гладкости может быть связано с показом ProgressDialog в начале запроса, но оно должно быть показано – Mohamad Armoon 8 April 2016 в 16:12
  • 2
    В чем причина вызова запроса GET, когда пользователь видит фрагмент? По умолчанию пейджер представления предварительно загружает фрагмент слева от текущего фрагмента и правый фрагмент текущего фрагмента. Для лучшего удобства пользователей я предварительно загружал данные еще до того, как пользователь увидит фрагмент, поместив этот метод в onCreateView, чтобы вам не пришлось показывать диалог прогресса. – Anthony Ng 8 April 2016 в 17:07
Другие вопросы по тегам:

Похожие вопросы: