3

У меня есть проблемы с FragmentPagerAdapter, я поставил фрагменты в ViewPager через FragmentPagerAdapter, я должен показать ViewPager динамически, у меня есть данные ListView, которые мне нужно, чтобы показать in viewpager, , когда я нажимаю на список, мне нужно загрузить точную позицию в viewpager , поэтому я просто устанавливаю общий размер элемента для отображения в FragmentPagerAdapter. Но проблема в том, что когда я выбираю позицию viewpager через mPager.setCurrentItem(listposition), показать правильную позицию viewpager, , но загрузка данных в неправильном месте, она загружается в следующем порядке в позиции viewpager, после некоторого отслеживания в FragmentPagerAdapter, я показываю, что i nstantiateItem метод инициализирует один фрагмент заранее, например, я устанавливаю currentitem (из списка) viewpager 2 , а затем метод instantiateItem инициализирует от 0 до 3 фрагментов, я думаю, что причина загрузки данных в 3-м фрагменте, я также много пробовал с FragmentStatePagerAdapter, но нет никакого успеха, пожалуйста, помогите мне, спасибо заранее.Android Viewpager.setCurrentitem() и FragmentPagerAdapter instantiateItem() фрагменты initailize несовпадение

Mainactivity класс (Fragmnetactivity):

public class NewsDetail extends FragmentActivity implements OnClickListener { 
    public static ViewPager mPager; 
    private static int NUM_PAGES; 
    private PagerAdapter mPagerAdapter; 
    public static ArrayList<Integer> exist_detail = new ArrayList<Integer>(); 
    public static ArrayList<PageFragment> detailfragment = new ArrayList<PageFragment>(); 


    mPager = (ViewPager) findViewById(R.id.pager); 
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
    mPager.setAdapter(mPagerAdapter); 

    NUM_PAGES = topList.size(); 
    PageFragment fragment = new PageFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("page", i); 
    fragment.setArguments(args); 
    detailfragment.add(fragment); 

    mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 

     @Override 
     public void onPageSelected(int arg0) { 
       if (PageFragment.getInstance() != null) { 
        Log.d("LOG","PageFragment || "+ PageFragment.getInstance()); 
        PageFragment.getInstance().startLoadingNews(
          MusicList.topMusicList.get(arg0)._id); 
       } 
      return; 
     } 

     @Override 
     public void onPageScrolled(int arg0, float arg1, int arg2) {} 

     @Override 
     public void onPageScrollStateChanged(int arg0) {} 
    }); 
    mPagerAdapter.notifyDataSetChanged(); 

    mPager.setCurrentItem(listposition);// setcurrent item from here , it is selected from list. "listposition" indicate list position click 



    private class ScreenSlidePagerAdapter extends FragmentPagerAdapter { 

      private FragmentManager mFragmentManager; 
      private FragmentTransaction mCurTransaction = null; 
      private Fragment mCurrentPrimaryItem = null; 
      private static final boolean DEBUG = false; 

      public ScreenSlidePagerAdapter(FragmentManager fragmentManager) { 
       super(fragmentManager); 
       this.mFragmentManager = fragmentManager; 
      } 

      @Override 
      public Fragment getItem(int position) { 

       return detailfragment.get(position); 
      } 

      @Override 
      public long getItemId(int position) { 
       // TODO Auto-generated method stub 
       return super.getItemId(position); 
      } 

      @Override 
      public Object instantiateItem(ViewGroup container, int position) { 

       Log.v("LOG", "On InstantiateItem " + position);// it indicate that this method initialize one fragment in advance. 

       return super.instantiateItem(container, position); 
      } 

      public String makeFragmentName(int viewId, long index) { 
       return "android:switcher:" + viewId + ":" + index; 
      } 

      @Override 
      public void destroyItem(ViewGroup container, int position, Object object) { 
       if (mCurTransaction == null) { 
        mCurTransaction = mFragmentManager.beginTransaction(); 
       } 
       if (DEBUG) 
        Log.e("LOG", "Detaching item #" + position + ": f=" + object 
          + " v=" + ((Fragment) object).getView()); 
       mCurTransaction.detach((Fragment) object); 
      } 

      @Override 
      public void restoreState(Parcelable state, ClassLoader loader) { 
      } 

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

PageFragment

 public class PageFragment extends Fragment implements OnClickListener { 

      @Override 
      public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       mPageNumber = getArguments().getInt(ARG_PAGE); 
       mDetailPageFragment = this; 
      } 

      @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
       // Inflate the layout containing a title and body text. 
       rootView = (ViewGroup) inflater.inflate(R.layout.newsdetail, container, 
         false); 
       //init(); 
       return rootView; 
      } 
      public void startLoadingNews(String _id) { 

       if (NetworkUtil.cheackNetwork(mActivity)) { 
        executeTask(_id); 
       } else { 
        showRetryCancelDialog(); 
       } 
      } 
      } 

ответ

0

Я вижу две проблемы в коде вы размещены:

  1. только экземпляры ваши фрагменты в FragmentPagerAdapter.getItem. Не создавайте экземпляр и не сохраняйте их в каком-либо списке или массиве, дайте FragmentPagerAdapter сделать это за вас. В FragmentPagerAdapter.instantiateItem он проверяет, был ли уже создан Fragment, и если он его возвращает, если нет, он вызовет ваш getItem для создания фрагмента.
  2. Не используйте схему для вашего фрагмента Singleton, создайте новый фрагмент с помощью конструктора или статического помощника .newInstance().
Смежные вопросы