为什么Tablayout和Viewpager与NullPointerException异常崩溃的时候,我开始从TabFragment与LoaderManager片段? [英] Why is Tablayout and Viewpager crashing with NullpointerException when I start a fragment with LoaderManager from TabFragment?

本文介绍了为什么Tablayout和Viewpager与NullPointerException异常崩溃的时候,我开始从TabFragment与LoaderManager片段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我下面的https://androidbelieve.com/navigation-drawer-with-swipe-tabs-using-design-support-library/实现滑动tablayout。

它可以完美的空片段,

不过,我有3个片段与LoaderManagers和recyclerViews,每一个加载不同的数据。当第一次加载,如果我从第一个片段上tabLayout第三个片段点击无滑动或点击到第二个应用程序,它崩溃。数据未加载,因为它实现LoaderManager,它开始从 OnLoadFinished实施()方法。我看不出的onCreate()..或者onCreateView()方法执行。我应该如何解决了这个问题?

 我的TabFragment:
公共类TabFragment扩展片段{    公共静态TabLayout tabLayout;
    公共静态ViewPager viewPager;
    公共静态INT int_items = 3;
    私人语境mContext;
    @Nullable
    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
        / **
         *充气tab_layout和设置视图。
         * /
        查看TabView的= inflater.inflate(R.layout.fragment_tab,NULL);
        tabLayout =(TabLayout)tabView.findViewById(R.id.tabs);
        viewPager =(ViewPager)tabView.findViewById(R.id.viewpager);        / **
         *设置一个Apater的寻呼机查看
         * /
        viewPager.setAdapter(新MyAdapter(getChildFragmentManager()));        / **
         *现在,这是一种解决方法,
         *没有可运行dose't作品setupWithViewPager。
         *也许支持库的Bug。
         * /        tabLayout.post(新的Runnable(){
            @覆盖
            公共无效的run(){
                tabLayout.setupWithViewPager(viewPager);
                的for(int i = 0; I< tabLayout.getTabCount();我++){
                    TabLayout.Tab标签= tabLayout.getTabAt(I)                }
            }
        });        返回TabView的;    }    类MyAdapter扩展FragmentPagerAdapter {        公共MyAdapter(FragmentManager FM){
            超(FM);
        }        / **
         *返回片段相对于位置。
         * /        @覆盖
        公共片段的getItem(INT位置)
        {
            开关(位置){
                情况下0:返回新TabFocusFragment();
                案例1:返回新TabFocusFragment();
                案例2:返回新TabFocusFragment();            }
            返回null;
        }        @覆盖
        公众诠释的getCount(){            返回int_items;        }
        @覆盖
        公共CharSequence的getPageTitle(INT位置){            开关(位置){
                情况下0:
                    回到第一;
                情况1 :
                    返回第二;
                案例2:
                    返回第三;
            }
            返回null;
        }
    }    }TabFocusFragment:    公共类TabFocusFragmentextends扩展片段
    实现LoaderManager.LoaderCallbacks<&光标GT;
    {
    私人TabFocusAdapter mAdapter;
    私人列表< E> mList;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        loadData(); //从未被执行,:(
        setHasOptionsMenu(真);
    }    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                             捆绑savedInstanceState){
        查看查看= inflater.inflate(R.layout.fragment_tab_focus,集装箱,FALSE);        loadData();
        SETU precyclerView();
        返回视图。
    }    @覆盖
    公共无效onResume(){
        super.onResume();
    }        @覆盖
        公共无效onLoadMore(){
    如果(NeedLoad)
           loadData();
        }        私人无效loadData(){
            // RequestData
        ......
    }
    私人无效SETU precyclerView(){
      ......    }    @覆盖
    公共装载机<&光标GT; onCreateLoader(INT ID,捆绑参数){
        返回新CursorLoader(mActivity,ContentProvider.createUri(E.class使用,空)
                NULL,NULL,NULL,NULL);
    }    @Override //片段从这里开始的,为什么?
    公共无效onLoadFinished(装载机<&光标GT;装载机,游标数据){
        如果(loadedList.size()大于0){
         //崩溃这里......        如果(!fullPacketLoaded){
        }
    }    @覆盖
    公共无效onLoaderReset(装载机<&光标GT;装载机){    }
TabFragmentLayout:    < XML版本=1.0编码=UTF-8&GT?;
<的LinearLayout
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:程序=htt​​p://schemas.android.com/apk/res-auto
    机器人:layout_width =match_parent
    机器人:方向=垂直
    机器人:layout_height =WRAP_CONTENT>
    < android.support.design.widget.TabLayout
        机器人:ID =@ + ID /标签
        应用:tabGravity =中心
        应用:tabMode =固定
        机器人:layout_width =match_parent
        机器人:layout_height =33dp
        机器人:fillViewport =假>
    < /android.support.design.widget.TabLayout>
    < android.support.v4.view.ViewPager
        机器人:ID =@ + ID / viewpager
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent>    < /android.support.v4.view.ViewPager>
< / LinearLayout中>我的错误了:
>显示java.lang.NullPointerException:尝试调用接口方法
> 布尔java.util.List.isEmpty()'上一个空对象引用
> com.xxx.xx.fragment.TabFocusFragment.onLoadFinished(TabFocusFragment.java :)
com.xxx.xx.fragment.TabFocusFragment.onLoadFinished(TabFocusFragment.java :)android.support.v4.app.LoaderManagerImpl $ LoaderInfo.callOnLoadFinished(LoaderManager.java:427)
> android.support.v4.app.LoaderManagerImpl.initLoader(LoaderManager.java:562)
> android.support.v4.app.Fragment.performCreate(Fragment.java:1766)
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:917)
android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:846)
> android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:860)
android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130)
> android.support.v4.view.ViewPager.populate(ViewPager.java:1103)11-17
> android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:551)GT; android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
> android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:494)GT; android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:1584)
> android.support.design.widget.TabLayout.selectTab(TabLayout.java:807)
> android.support.design.widget.TabLayout.selectTab(TabLayout.java:779)
> android.support.design.widget.TabLayout $ Tab.select(TabLayout.java:1039)
> android.support.design.widget.TabLayout $ 1.onClick(TabLayout.java:620)
> android.view.View.performClick(View.java:4785)10月11日至17日:35:42.619
> android.view.View $ PerformClick.run(View.java:19858)11-17中10:35:42.619
> android.os.Handler.handleCallback(Handler.java:739)11-17中10:35:42.619
> android.os.Handler.dispatchMessage(Handler.java:95)11-17中10:35:42.619
> android.os.Looper.loop(Looper.java:155)10月11日至17日:35:42.619
> android.app.ActivityThread.main(ActivityThread.java:5696)11-17
> java.lang.reflect.Method.invoke(本机方法)10月11日至17日:35:42.619
> java.lang.reflect.Method.invoke(Method.java:372)10月11日至17日:35:42.619> com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1028)
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)


解决方案

Simplily调整offpagelimite值

  viewpager.setOffscreenPageLimit(2)

由于默认值为1。

I am following the tutorial of https://androidbelieve.com/navigation-drawer-with-swipe-tabs-using-design-support-library/ to implement sliding tablayout.

It works perfect for empty fragments,

However, I have 3 fragments with LoaderManagers and recyclerViews, each one loads different data. When the app loaded at the first time, if I click from the first fragment to the third fragment on the tabLayout without sliding or clicking to second one, it crashes. The data was not loading, as it implements LoaderManager, it started implementing from OnLoadFinished() method. I couldn't see onCreate().. or onCreateView() method was executed. How should I fixed this?

My TabFragment:


public class TabFragment extends Fragment {

    public static TabLayout tabLayout;
    public static ViewPager viewPager;
    public static int int_items = 3 ;
    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);

        /**
         *Set an Apater for the View Pager
         */
        viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));

        /**
         * Now , this is a workaround ,
         * The setupWithViewPager dose't works without the runnable .
         * Maybe a Support Library Bug .
         */

        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                tabLayout.setupWithViewPager(viewPager);
                for (int i = 0; i < tabLayout.getTabCount(); i++) {
                    TabLayout.Tab tab = tabLayout.getTabAt(i);

                }
            }
        });

        return tabView;

    }

    class MyAdapter extends FragmentPagerAdapter{

        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        /**
         * Return fragment with respect to Position .
         */

        @Override
        public Fragment getItem(int position)
        {
            switch (position){
                case 0 : return new TabFocusFragment();
                case 1 : return new TabFocusFragment();
                case 2 : return new TabFocusFragment();

            }
            return null;
        }

        @Override
        public int getCount() {

            return int_items;

        }


        @Override
        public CharSequence getPageTitle(int position) {

            switch (position){
                case 0 :
                    return "First";
                case 1 :
                    return "Second";
                case 2 :
                    return "Third";
            }
            return null;
        }
    }



    }



TabFocusFragment:

    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() {
            //Reque

stData
        ……
    }


    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) {

    }


TabFragmentLayout:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="wrap_content">


    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        app:tabGravity="center"
        app:tabMode="fixed"
        android:layout_width="match_parent"
        android:layout_height="33dp"
        android:fillViewport="false">
    </android.support.design.widget.TabLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>




</LinearLayout>



Errors I got:
> java.lang.NullPointerException: Attempt to invoke interface method
> 'boolean java.util.List.isEmpty()' on a null object reference    at
> com.xxx.xx.fragment.TabFocusFragment.onLoadFinished(TabFocusFragment.java:)
com.xxx.xx.fragment.TabFocusFragment.onLoadFinished(TabFocusFragment.java:)

android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:427)
> android.support.v4.app.LoaderManagerImpl.initLoader(LoaderManager.java:562)
> android.support.v4.app.Fragment.performCreate(Fragment.java:1766)
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:917)
android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:846)
> android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:860)
android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:130)
> android.support.v4.view.ViewPager.populate(ViewPager.java:1103) 11-17
> android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:551)> android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:513)
> android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:494)> android.support.design.widget.TabLayout$ViewPagerOnTabSelectedListener.onTabSelected(TabLayout.java:1584)
> android.support.design.widget.TabLayout.selectTab(TabLayout.java:807)
> android.support.design.widget.TabLayout.selectTab(TabLayout.java:779)
> android.support.design.widget.TabLayout$Tab.select(TabLayout.java:1039)
> android.support.design.widget.TabLayout$1.onClick(TabLayout.java:620)
> android.view.View.performClick(View.java:4785) 11-17 10:35:42.619
> android.view.View$PerformClick.run(View.java:19858) 11-17 10:35:42.619
> android.os.Handler.handleCallback(Handler.java:739) 11-17 10:35:42.619
> android.os.Handler.dispatchMessage(Handler.java:95) 11-17 10:35:42.619
> android.os.Looper.loop(Looper.java:155) 11-17 10:35:42.619
> android.app.ActivityThread.main(ActivityThread.java:5696) 11-17
> java.lang.reflect.Method.invoke(Native Method) 11-17 10:35:42.619
> java.lang.reflect.Method.invoke(Method.java:372) 11-17 10:35:42.619> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

解决方案

Simplily adjust offpagelimite value

viewpager.setOffscreenPageLimit(2), 

As the default value was 1.

这篇关于为什么Tablayout和Viewpager与NullPointerException异常崩溃的时候,我开始从TabFragment与LoaderManager片段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆