2016-04-08 3 views
3

Это мой сценарий:Обновить данные в ViewPager Фрагмент

У меня есть ViewPager в моей деятельности, которая хозяйничает 6 осколок. Я отключил пейджинг, проводя палец, так что всякий раз, когда я хочу красть я использую соответствующую кнопку и:

viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true); 

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

Первый подход: Я использовал этот код в моих фрагментов, который работает, как только фрагмент станет видимым:

@Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
     if(isVisibleToUser) 
     { 
      sendGetRequest(); 
     } 
} 

Но вот проблема: что setUserVisibleHint выполняет точно когда фрагмент видится, и из-за этого анимация прокрутки пришла с некоторым отставанием (это было недостаточно гладко).

Так что я использовал Второй подход: Я добавил OnPageChangeListener() к ViewPager в организованной деятельности, как это:

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      int CurrentPossition = 0; 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } 
      @Override 
      public void onPageSelected(int position) { 
       CurrentPossition = position; 
      } 
      @Override 
      public void onPageScrollStateChanged(int state) { 
       if(state == ViewPager.SCROLL_STATE_IDLE && CurrentPossition != 0){ 
        Toast.makeText(getBaseContext(),"finished" , Toast.LENGTH_SHORT).show(); 

        try{ 
         new fragment_two().sendGetRequest();; 
        }catch(Exception ex){ 
         ex.printStackTrace(); 
        } 
       } 
      } 
     }); 

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

здесь StackTrace:

04-08 20:15:37.840 12848-12848/com.example.mohamad.travelagency W/System.err: java.lang.NullPointerException 
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:152) 
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:103) 
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:143) 
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.app.AlertDialog.<init>(AlertDialog.java:98) 
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.app.ProgressDialog.<init>(ProgressDialog.java:77) 
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err:  at com.example.mohamad.travelagency.fragment_two.GetServetData_L1(fragment_two.java:458) 
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err:  at com.example.mohamad.travelagency.MainActivity$1.onPageScrollStateChanged(MainActivity.java:124) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.support.v4.view.ViewPager.dispatchOnScrollStateChanged(ViewPager.java:1811) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.support.v4.view.ViewPager.setScrollState(ViewPager.java:404) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.support.v4.view.ViewPager.access$000(ViewPager.java:91) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.support.v4.view.ViewPager$3.run(ViewPager.java:250) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.view.Choreographer.doFrame(Choreographer.java:543) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.os.Handler.handleCallback(Handler.java:733) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.os.Looper.loop(Looper.java:136) 
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5271) 
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err:  at java.lang.reflect.Method.invokeNative(Native Method) 
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err:  at java.lang.reflect.Method.invoke(Method.java:515) 
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851) 
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:667) 
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err:  at dalvik.system.NativeStart.main(Native Method) 

любая идея будет велика. наилучшие пожелания

Ответ: Код Daniel NUGENT работало хорошо, рядом для показа ProgressDialog во время отправки GET запроса я использовал:

final ProgressDialog dialog = new ProgressDialog(new MainActivity()); 

этот код возвращается NullPointerException тоже я удалил его и теперь хорошо работает.

+0

Сообщение StackTrace – Naveed

+0

получить фрагмент с помощью GetItem () в onpageSelected(), который добавляется к вашему адаптеру viewpager. проверка null. если не null, то выполните ваш серверный вызов – Sayem

+0

, чтобы фрагмент стал видимым полностью, возможно ли, чтобы нулевой фрагмент стал видимым и показывал его статические представления? –

ответ

3

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

Вы делаете это с помощью instantiateItem() метода переопределения в адаптере, здесь приведен упрощенный пример:

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(); 
} 
+0

спасибо Даниэлю Нугенту. для вашего полного ответа. есть проблема:
'mAdapter.fragments [CurrentPossition];' возвращает ** Фрагмент **, но мое желание - это ** fragment_two **, которое простирается от Fragment, Как я могу отнести его к 'fragment_two' –

+0

снова i'am получая ту же ошибку, я использовал FragmentStatePagerAdapter, я изменил ее на FragmentPagerAdapter, но снова NullPoiterException. –

+1

ваш подход действительно сработал, спасибо много помощнику. –

0

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

+0

, как я упомянул в первом подходе, все работало хорошо, когда я использовал sendGetRequest() в onCreateView или setUserVisibleHint, проблема в этом случае была непростой. это отсутствие гладкости может быть связано с показом ProgressDialog в начале запроса, но должно быть показано –

+0

. В чем причина вызова запроса GET, когда пользователь видит фрагмент? По умолчанию пейджер представления предварительно загружает фрагмент слева от текущего фрагмента и правый фрагмент текущего фрагмента. Для лучшего удобства пользователей я предварительно загружал данные еще до того, как пользователь увидит фрагмент, поместив этот метод в onCreateView, чтобы вам не пришлось показывать диалог прогресса. –