[英]ViewPager not showing all Fragments added using FragmentPagerAdapter in TabLayout
我有一個自定義FragmentPagerAdapter,它用於將兩個片段加載到具有TabLayout中相應標簽標題的ViewPager中,但是,當我運行代碼時,僅顯示一個片段,但是兩個片段標題都顯示在選項卡上。 最初,兩個片段都沒有顯示,然后我將gradle依賴項的support:appcompat和support:design都降級到v7 23.0.1,而我的編譯版本降到了23。這樣做之后,只顯示了一個片段,而stacktrace是靜默的。 這兩個片段都是ListFragments(來自支持庫)。
編輯:第一個片段出現在第二個片段的位置,並且第二個片段根本不顯示
ViewPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments = new ArrayList<>();
private final List<String> fragmentTitles = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager){super(manager);}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return fragmentTitles.get(position);
}
public void addFragment(Fragment fragment, String title){
fragments.add(fragment);
fragmentTitles.add(title);
}
}
TabbedActivity.java:
public class TabbedActivity extends AppCompatActivity {
Toolbar toolBar;
ViewPager viewPager;
TabLayout tabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tabbed);
toolBar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolBar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager = (ViewPager) findViewById(R.id.viewpager);
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
//Appearing in 2nd fragment position
adapter.addFragment(new FirstFragment(), "Frag 1");
//Not appearing
adapter.addFragment(new SecondFragment(), "Frag 2");
viewPager.setAdapter(adapter);
tabLayout = (TabLayout) findViewById(R.id.tablayout);
tabLayout.setupWithViewPager(viewPager);
}
}
FirstFragment.java
public class FirstFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
SimpleCursorAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] from = {"_id", "name"};
int[] to = {R.id.lvtextViewTwo, R.id.lvtextViewOne};
adapter = new SimpleCursorAdapter(getActivity(), R.layout.list_view_layout, null, from, to, 0);
setListAdapter(adapter);
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.first_fragment, container, false);
}
@Override
public void onPause() {
super.onPause();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri uri = DatabaseContentProvider.CUSTOMER_URI;
return new CursorLoader(getActivity(), uri, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
SecondFragment.java:
public class SecondFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>{
SimpleCursorAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] from = {"_id", "name"};
int[] to = {R.id.lvtextViewTwo, R.id.lvtextViewOne};
adapter = new SimpleCursorAdapter(getActivity(), R.layout.list_view_layout, null, from, to, 0);
setListAdapter(adapter);
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.second_fragment, container, false);
}
@Override
public void onPause() {
super.onPause();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
Uri uri = DatabaseContentProvider.ORDER_URI;
return new CursorLoader(getActivity(), uri, null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
PS:SO的新手,如果我遺漏了任何東西,請告訴我。
填充您的List
的Fragments
內FragmentPagerAdapter
或通過預先填入List
通過constructor
的adapter
public ViewPagerAdapter(FragmentManager manager)
{
super(manager);
//Title 'Frag 1' shows, but not actual fragment
addFragment(new FirstFragment(), "Frag 1");
//Both title and fragment show
addFragment(new SecondFragment(), "Frag 2");
}
要么
public ViewPagerAdapter(FragmentManager manager, List<Fragment> fragments)
{
super(manager);
this.fragments = fragments;
}
我發現問題是調用了getActivity().getSupportLoaderManager().initLoader(0, null, this);
兩個Fragments
具有相同的ID(0)
。 解決方案是給每個initLoader
調用一個唯一的ID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.