2016-11-07 5 views
0

Ich habe eine Fragment mit einer ViewPager, die drei Fragment s behandelt. Der erste von ihnen enthält eine RecyclerView. Hier ist ein Code:ViewPager und RecyclerView extrange Verhalten

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; 
} 

Und loadData Methode ist ein API-Aufruf über AsyncTask, die den Adapter auffüllt. Dies ist die OnPostExecute Methode:

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

Das Problem ist, wenn ich die erste instanziiert ViewPager nichts in dem ersten Fragment auch den API-Aufruf zeigte und die notifyDataSetChanged() Methode aufgerufen werden. Aber wenn ich zwischen den anderen Fragmenten scrolle und die FirstFragment von der ViewPager neu erstellt wird, dann werden die Daten angezeigt.

Haben Sie eine Idee, was hier passiert?

+0

versuchen, verschiedene Fragmentklassen für jede Registerkarte nicht nur ein Fragment Instanzen. ich hoffe, es wird helfen –

+0

Sorry masoud, ich hatte einige Fehler in meiner Frage :). Ich habe es bearbeitet. – jos

Antwort

2

Nach dem Erhalten der Antwort Update-Daten MyList (ArrayList <>) von FragmentAdapter, durch eine beliebige Methode von Ihnen erstellt und dann notifyDataSetChanged() -Methode von Adapter.

myList = (ArrayList <>) Ergebnis; Diese Initialisierung spiegelt sich nicht in FragmentAdapter ArrayList

+0

Danke! Du hast recht :). Ich habe das Ergebnis myList = (ArrayList <>) geändert; zu myList.clear(); myList.adAll ((ArrayList ) Ergebnis); und jetzt funktioniert es – jos

+1

@jos das ist, warum ich immer eine Basis-Adapter-Klasse mit privaten endgültigen ArrayList machen, und der Adapter hat SetItems (Liste ), die innere Liste löscht und verwendet addAll() darauf. Auf diese Weise können Sie die Daten aus dem äußeren Code nicht durcheinander bringen. –

1
adapterViewPager = new PlayerPagerAdapter(getChildFragmentManager()); 

Sie sind bereits in ein Fragment, so müssen Sie dieses Fragment Instanz von Fragment-Manager zu erhalten.

+0

Hallo Florescu, danke für deine Antwort. Ich habe es versucht, aber das gleiche Ergebnis :( – jos

+0

Schauen Sie in Ihrem Adapter. Wird bevölkert, nachdem API reagiert? –

+0

Der Fehler war in der Art, dass ich die Liste des Adapters festgelegt wurde. Werfen Sie einen Blick auf die richtige Antwort, wenn Sie interessiert sind Danke! – jos

Verwandte Themen