簡體   English   中英

ViewPager不顯示在TabLayout中使用FragmentPagerAdapter添加的所有片段

[英]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的新手,如果我遺漏了任何東西,請告訴我。

填充您的ListFragmentsFragmentPagerAdapter或通過預先填入List通過constructoradapter

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM