2016-11-07 41 views
0

我有一個ViewPager其處理三種FragmentFragment。其中第一個包含RecyclerView。下面是一些代碼:ViewPager和RecyclerView交流中心的行爲

FragmentViewPager

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_player_view_pager, container, false); 

    ViewPager vpPager = (ViewPager) view.findViewById(R.id.playerViewPager); 
    adapterViewPager = new PlayerPagerAdapter(getFragmentManager()); 
    vpPager.setAdapter(adapterViewPager); 

    return view; 
} 

FragmentPagerAdapter

// Returns the fragment to display for that page 
@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 0: 
      return FirstFragment.newInstance("0", "Page # 1"); 
     case 1: 
      return SecondFragment.newInstance("1", "Page # 2"); 
     case 2: 
      return ThirdFragment.newInstance("2", "Page # 3"); 
     default: 
      return null; 
    } 
} 

FirstFragment

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_first, container, false); 

    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView); 
    adapter = new FragmentAdapter(getActivity(), myList); 

    recyclerView.setItemAnimator(new SlideInUpAnimator(new OvershootInterpolator(1f))); 
    recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 2)); 

    recyclerView.setAdapter(adapter); 

    loadData(); 

    return view; 
} 

loadData方法是通過AsyncTask填充適配器的API調用。這是onPostExecute方法:

myList = (ArrayList<>) result; 
adapter.notifyDataSetChanged(); 

問題是,當我第一次實例化ViewPager沒有被顯示在第一Fragment甚至API調用和notifyDataSetChanged()方法被調用。但是如果我在其他片段之間滾動,並且由ViewPager重新創建FirstFragment,則會顯示數據。

你有什麼想法,這裏發生了什麼?

+0

嘗試爲每個標籤不只是一個片斷實例設置不同的片段類。我希望它會有所幫助 –

+0

對不起,masoud,我的問題有一些錯誤:)。我編輯它。 – jos

回答

2

獲取FragmentAdapter的響應更新數據myList(ArrayList <>)後,通過您創建的任何方法,然後調用Adapter的notifyDataSetChanged()方法。

myList中=(ArrayList的<>)結果; 此初始化不是FragmentAdapter ArrayList中反映

+0

謝謝!你是對的:)。我改變了myList =(ArrayList <>)的結果;到myList.clear(); myList.adAll((ArrayList )result);現在它的工作 – jos

+1

@jos這就是爲什麼我總是包含私人最終的ArrayList 基適配器類,適配器具有setItems(名單),它會清除內部列表和它使用中的addAll()。這樣你就不能搞亂外部代碼的數據。 –

1
adapterViewPager = new PlayerPagerAdapter(getChildFragmentManager()); 

您已經進入片段,因此您需要獲取片段管理器的片段實例。

+0

嗨弗洛雷斯庫,謝謝你的回答。我試過,但相同的結果:( – jos

+0

看着你的適配器。api是響應後是否填充? –

+0

錯誤是在我設置適配器列表的方式。在正確答案看一看,如果你有興趣。謝謝! – jos

相關問題