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
stattFragmentPagerAdapter
, 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 inAppCompatActivity
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();
}
}
}
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. –
Das Fragment ist nur eine Recycleransicht, die von einer URL basierend auf einer Namenszeichenfolge heruntergeladene Texte/Bilder anzeigt . –
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 –