我左侧的抽屉导航视图连接到具有不同视图的不同片段。结构如下。
MainActivity 抽屉导航视图
| Fragment A -- ViewPagerA ----Tab1 - Fragment1
Tab2 - Fragment2
| Tab3 - Fragment3
| Fragment B -- ViewPagerB ----Tab1 - Fragment4
Tab2 - Fragment5
| Tab3 - Fragment6
Fragment1-6是列表视图片段。
问题是当我从片段A切换到片段B时,viewpager将从Fragment1缓存列表视图的内容,并尝试向Fragment4的适配器显示缓存的内容。因此,当我第一次从导航抽屉切换片段时,它总是显示错误的信息。
我的代码:
MainActivity:
public class MainActivity extends Activity {
@InjectView(R.id.navigation_view) public NavigationView mNavigationView;
@InjectView(R.id.drawerLayout) public DrawerLayout mDrawerLayout;
//......Layout injections..............///
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, mToolbar,R.string.app_name,
R.string.app_name){
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
}
public void setUpToggle()
{
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// This method will trigger on item Click of navigation menu
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
if (menuItem.isChecked()) menuItem.setChecked(false);
else menuItem.setChecked(true);
//Closing drawer on item click
mDrawerLayout.closeDrawers();
switch (menuItem.getItemId()) {
case R.id.a_drawer:
startFragment(FragmentA.newInstance());
return true;
case R.id.b_drawer:
startFragment(FragmentB.newInstance());
return true;
default:
Toast.makeText(getApplicationContext(),"More things need to be added",Toast.LENGTH_SHORT).show();
return true;
}
}
});
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
}
}
片段A / B(完全相同的结构和布局)
public class TabFragment extends Fragment {
public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = n; //n is any positive integer
private Context mContext;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/**
*Inflate tab_layout and setup Views.
*/
View tabView = inflater.inflate(R.layout.fragment_tab,null);
tabLayout = (TabLayout) tabView.findViewById(R.id.tabs);
viewPager = (ViewPager) tabView.findViewById(R.id.viewpager);
viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
return tabView;
}
class MyAdapter extends FragmentStatePagerAdapter{
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position)
{
switch (position){
case 0 : return new Fragment1();//or Fragment4 5 6 here
case 1 : return new Fragment2();
case 2 : return new Fragment3();
default:return new Fragment1();
}
}
@Override
public int getCount() {
return int_items;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position){
case 0 :
return "F1";
case 1 :
return "F2";
case 2 :
return "F3";
}
return null;
}
}
片段1 - 6:
public class TabFocusFragmentextends extends Fragment
implements LoaderManager.LoaderCallbacks<Cursor>
{
private TabFocusAdapter mAdapter;
private List<E> mList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadData();// never been executed,:(
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tab_focus, container, false);
loadData();
setupRecyclerView();
return view;
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onLoadMore() {
if(NeedLoad)
loadData();
}
private void loadData() {
//RequestData
……
}
private void setupRecyclerView() {
…...
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(mActivity, ContentProvider.createUri(E.class, null),
null, null, null, null);
}
@Override //fragment starts here, why??
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if (loadedList.size() > 0) {
//crashes here …...
if (!fullPacketLoaded) {
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
如果新的片段列表适配器没有适合显示以前的内容,它将崩溃。
基于这个问题,如果您对下面的问题有更好的解决方案吗? Why is Tablayout and Viewpager crashing with NullpointerException when I start a fragment with LoaderManager from TabFragment?
答案 0 :(得分:0)
终于修好了。
在我的onCreate()方法中,哪个片段实现了LoaderManager,我做了这个
getLoaderManager().initLoader(0, null, this);
if(!getLoaderManager().getLoader(0).isReset()) {
getLoaderManager().restartLoader(0, null, this);
}
当新加载程序未正确激活时,它可以正常工作。