2016-04-25 87 views
0

我在ViewPager中設置了光滑滾動Fragments,嵌套在另一個Fragment中,它充當它們的父項。Android中的smoothScrollToPosition兒童內部ViewPager中的片段

我成立這個方法:

public void scrollToTop() 
    { 
     this.recyclerView.smoothScrollToPosition(0); 
    } 

對於Fragments不是在ViewPager,但我不知道怎麼弄的Fragments一個ViewPager內部參考。

我做

BottomLobiFragment activeLobi = (BottomLobiFragment)getSupportFragmentManager().findFragmentByTag(utilities.lobbyTag); 

獲取父Fragment

代碼爲ViewPager(其餘的幾乎相同,差別只在項目數量和構造函數)

public class LobbyPagerAdapter extends FragmentStatePagerAdapter { 

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

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 
       case 0: return Friends.newInstance("Friends, Instance 1"); 
//    case 1: return Photo.newInstance("Photo, Instance 1"); 
//    case 2: return Activities.newInstance("Activities, Instance 1"); 
       default: return Friends.newInstance("Friends, Default"); 
      } 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return CONTENT[position % CONTENT.length]; 
     } 

     @Override 
     public int getCount() { 
      //return 3; 
      return CONTENT.length; 
     } 

     private class setAdapterTask extends AsyncTask<Void,Void,Void> { 
      protected Void doInBackground(Void... params) { 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
      } 
     } 
    } 

注:每個適配器位於父裏面Fragment

+0

顯示您用於ViewPager的適配器的代碼以及 –

回答

0

首先修改適配器到這個

public class LobbyPagerAdapter extends FragmentStatePagerAdapter { 

     private ArrayList<Fragment> mFragments = new ArrayList<>(); 

     public LobbyPagerAdapter (FragmentManager fm) { 
      super(fm); 
      mFragments.add(Friends.newInstance("Friends, Instance 1")); 
      mFragments.add(Photo.newInstance("Photo, Instance 1")); 
      mFragments.add(Activities.newInstance("Activities, Instance 1")); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      return mFragments.get(pos); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return CONTENT[position % CONTENT.length]; 
     } 

     @Override 
     public int getCount() { 
      //return 3; 
      return CONTENT.length; 
     } 

     private class setAdapterTask extends AsyncTask<Void,Void,Void> { 
      protected Void doInBackground(Void... params) { 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
      } 
     } 
    } 

現在在你的片段或活動是拿着ViewPager &適配器實例,你可以簡單地做如adapter.getItem(1);例如:

//Suppose your LobbyPagerAdapter instance looks like this in your code 

LobbyPagerAdapter adapter = new LobbyPagerAdapter(getFragmentManager()); 

// And now you want to get the fragment at second position in your tab 

Photo photoFragmentObject = (Photo)adapter.getItem(1); 

// And now you want to get the fragment at first position in your tab 

Friends friendsFragmentObject = (Friends)adapter.getItem(0); 
+0

Ohhhh所以基本上我需要將'Adapter'變成公共類?使用我的'getItem'方法返回'Fragments'和你逐一添加的方法有什麼區別? –

+0

與你的'getItem'方法,你總是會得到片段的「New」實例,而不是viewpager中的那個實例,並且最終會產生'NullPointerException'。 所以我們只實例化片段構造和它們存儲在'ArrayList', 所以我們可以有相同的實例,每次我們通過的'getItem',而不是新的 –

+0

媽需要時間,所以這就是爲什麼我的ViewPager內片段保持清爽,對?當我回到它時,我會改變它,與此同時,我正在修補應用程序的其他部分,謝謝!順便說一句,爲什麼getFragmentManager()不是'getChildFragmentManager()'? –