2016-02-23 2 views
0

Я хочу использовать ViewPager, чтобы пронести по песням в моем Media Player (движение вперед или назад, как приложение SoundCloud для Android). я создал фрагмент, который я inflate и установить внутреннюю информацию, как название песни, автор и т.д.ViewPager возвращает неправильный фрагмент

Я прочитал некоторые темы на StackOverflow о ViewPager отображает неправильные детали (Viewpager shows wrong page и Android Viewpager show wrong pages и многое другое), но я не» t имеет фиксированное число XML, чтобы использовать его с ViewPager.

Мои данные отображаются в RecyclerView, когда я нажав на элемент с индексом 4, например, я называю следующий метод:

 mPager.setCurrentItem(position); 

Так mPager установлен в положение 4.

@Override 
    public Fragment getItem(int position) { 
     Log.i("TEST","Returnin a fragment on position "+position); 
     return fragment = new MusicSliderFragment(); 
    } 

Но на мой Adapter, когда он меняется, я получаю следующий результат:

02-23 10:39:57.131 7599-7599/************** I/TEST: Returning a fragment on position 4 
02-23 10:39:57.131 7599-7599/************** I/TEST: Returning a fragment on position 3 
02-23 10:39:57.131 7599-7599/************** I/TEST: Returning a fragment on position 5 

И когда мое приложение запускается, я получаю следующий результат:

I/TEST: Returning a fragment on position 0 
I/TEST: Returning a fragment on position 1 

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

Есть ли способ, как я могу это исправить?

адаптер Класс:

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 

     private MusicSliderFragment fragment; 

     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      Log.i("TEST","Returnin a fragment on position "+position); 
      return fragment = new MusicSliderFragment(); 
     } 

     @Override 
     public int getCount() { 
      return NUM_PAGES; 
     } 

     public void updateSongName(String name) { 
      fragment.setSongName(name); 
     } 
    } 

RecyclerViewListener:

  musicList.addOnItemTouchListener(
      new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() { 
       @Override 
       public void onItemClick(View view, final int position) { 

         Log.i("TEST", "Setting the mPager position to: "+position); 
         mPager.setCurrentItem(position); 
        } 
       } 


And the `Listener` of the `mPager` where I update the song name for example: 

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

      } 

      @Override 
      public void onPageSelected(int position) { 

       play(position); 

       ScreenSlidePagerAdapter adapter = (ScreenSlidePagerAdapter) mPager.getAdapter(); 
       adapter.updateSongName(splitName(myDataList.get(position))[0]); 

       Log.i("TEST", "Playing the position: "+position); 
       mPagerAdapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 
+0

вы имеете в виду положения четыре является четвёртым фрагментом? Ваш индекс начинается с 0 или 1? –

+0

Моя позиция в массивах и RecyclerView начинается с 0, о позиции viewpager Я думаю, что она начинается с 0. –

+0

Нет, она начинается с 0, просто установите позицию как 3, она должна работать для вас. Сообщите мне, если это проблема. –

ответ

2

Посмотреть пейджера может загружать соседние фрагменты при выборе тока. Метод setOffscreenPageLimit() определяет, сколько соседей вы хотите предварительно загрузить. onPageSelected (int position) должен работать правильно и возвращает текущий элемент.

+0

Итак, просмотрщик загружает страницу 4, а затем загружает соседа (3 и 5), как я могу заставить его вернуть фрагмент 4 тогда :)? –

+0

, если вы хотите достичь фрагмента 4, вы можете прокручивать один за другим. Или, если вы хотите достичь этого сразу, вы можете pager.setCurrentItem (num). –

+0

Я делаю это в списке RecyclerView, но потом, как вы сказали, он получает его соседу 3 и 5, а текущий фрагмент остается 5. –

0

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

mPager.setCurrentItem(3); //Load the 4th fragment according to you.(0-3) 
+0

Мой recyclerview начинается с 0, поэтому, когда я загружаю индекс 4, mPager устанавливает индекс до 4, я не думаю, что это проблема, если я делаю позицию - 1 трюк, когда я нажимаю индекс 0 из RecyclerView, он будет вызывать setCurrentItem равным -1, и это неверно. –

Смежные вопросы