2017-01-24 2 views
0

In meiner Android-Anwendung verwende ich eine TabLayout mit einer FragmentStatePagerAdapter, um dynamisch generierte Fragmente anzuzeigen. Es zeigt korrekt die Fragmente das erste Mal, aber wenn zurück zu einigen, die bereits angesehen werden und nicht die angrenzenden sind, zeigt es eine leere Seite ...TabLayout zeigt ein leeres Fragment, das zweite Mal

Ich habe in das geschaut und es scheint zwei zu sein Weg, dies zu fixieren:

  • Mit FragmentStatePagerAdapter statt FragmentPagerAdapter, die ich schon getan, und es hat nichts ändern.

  • ändern
    adapter = new FragmentStatePagerAdapter(*getSupportFragmentManager*());
    in:
    adapter = new FragmentStatePagerAdapter(*getChildFragmentManager*());
    , die ich nicht tun kann, weil ich in AppCompatActivity und diese Methode bin, ist in Fragmente ...

Gibt es eine Möglichkeit um dieses Problem zu lösen, ohne diese Aktivität aus FragmentActivity zu erweitern, die andere Sachen in meinem Projekt vermasseln würde?

Code:

private class SubsPagerAdapter extends FragmentStatePagerAdapter { 

    private final ArrayList<Fragment> fragmentsList = new ArrayList<>(); 
    private final ArrayList<String> titleList = new ArrayList<>(); 

    SubsPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragmentsList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return fragmentsList.size(); 
    } 

    void addFragment(Fragment fragment, String title) { 
     fragmentsList.add(fragment); 
     titleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return titleList.get(position); 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 
} 

Umsetzung:

subsPager = (ViewPager) findViewById(R.id.subsPager); 
         tabLayout = (TabLayout) findViewById(R.id.tabs_view); 

subsPager.setAdapter(adapter); 
tabLayout.setupWithViewPager(subsPager) 

Bearbeiten - Fragment Code:

public class PostsListFragment extends Fragment { 

private ArrayList<CustomPost> posts; 

private Sorting sorting; 

private String name; 
private RecyclerView recyclerView; 
private SubPostsAdapter adapter; 
private LinearLayoutManager linearLayoutManager; 
private Fetcher fetcher 

public PostsListFragment() { 
    this.posts = new ArrayList<>(); 
} 

public static Fragment newInstance(String name) { 
    PostsListFragment pf = new PostsListFragment(); 
    pf.name = name; 

    return pf; 
} 

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    recyclerView = (RecyclerView) inflater.inflate(R.layout.posts_list_holder, container, false); 

    //default sorting 
    this.sorting = Sorting.HOT; 
    this.fetcher = new Fetcher(name); 

    loadItems(); 

    return recyclerView; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    setHasOptionsMenu(true); 
} 

private void loadItems() { 
    if (posts.size() == 0) { 
     new Thread() { 
      @Override 
      public void run() { 
       posts.addAll(fetcher.fetchPosts(sorting)); 

       new Thread() { 
        @Override 
        public void run() { 
         linearLayoutManager = new LinearLayoutManager(recyclerView.getContext()); 

         adapter = new SubPostsAdapter(posts, getActivity()); 

         getActivity().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           recyclerView.setLayoutManager(linearLayoutManager); 
           recyclerView.setAdapter(adapter); 
          } 
         }); 

        } 
       }.start(); 
      } 
     }.start(); 
    } 
} 
} 
+0

Was meinen Sie "zeigt eine leere Seite"? 1) erstellst du ein Fragment an irgendeinem Punkt? 2) Kannst du den Code eines Beispiels zeigen, dem dies passiert? Ein ViewPager-Stills ruft den vollständigen Lebenszyklus eines Fragments auf. Wenn es leer ist und Daten heruntergeladen werden soll, wird es später erneut ausgeführt. –

+0

Das Fragment ist nur eine Recycleransicht, die von einer URL basierend auf einer Namenszeichenfolge heruntergeladene Texte/Bilder anzeigt . –

+0

Ihr Problem ist, dass 'pf.name = name' als Null gesetzt ist, wenn Sie zurück zum Fragment wischen. So legen Sie Instanzvariablen nicht auf Fragmente fest –

Antwort

0

Es war dümmer dann sah es aus, entfernen Sie diese Zeile:

if (posts.size() == 0) { 

von loadItems im Fragment, funktioniert wie beabsichtigt. Danke an cricket_007 für die Ratschläge!

Verwandte Themen