首页 > 解决方案 > 尝试调用虚拟方法 'void androidx.recyclerview.widget.RecyclerView.setAdapter

问题描述

我是 Java 新手。在我无法重现的崩溃中发现了错误。

错误是: 引起:java.lang.NullPointerException:尝试在 com.oxf 的空对象引用上调用虚拟方法 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' .oxford.ui.TasksFragment.initRecyclerView(TasksFragment.java:221)

在应用程序的一百次启动中,该错误出现了几次。我只是不能重复我所做的任何错误。

这是TasksFragment:

    public class TasksFragment extends Fragment implements OnTaskListener  {

   ..........


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);

        TransitionInflater inflater = TransitionInflater.from(requireContext()); 
        setExitTransition(inflater.inflateTransition(R.transition.fade));

        MobileAds.initialize(getActivity(), new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
                loadRewardedAd();
            }
        });

        mTaskListViewModel = new ViewModelProvider(this).get(TaskListViewModel.class);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_tasks, container, false);
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        Log.d(TAG, "onViewCreated" + isSettingsSet + responseResult);
        isQueryInAction = false;

        initToolbar();
        initRecyclerView();
        subscribeObservers();
        loadRewardedAd();

        Log.d(TAG, "onViewCreated - showAds : " + showAds);

        if (responseResult==null)
            getSettings();

        if (isSettingsSet) {
             Log.d(TAG, "onViewCreated if isSettingsSet " + responseResult);
             if (responseResult!=LOADING)
                    initRepositoryRequest();
        }
        else
            showNoSettingsView();
    }

    ........

    private void initRecyclerView () {
        mRecyclerView = getActivity().findViewById(R.id.recyclerView);
        mAdapter = new TaskRecyclerAdapter(this);
        mRecyclerView.setAdapter(mAdapter);

        Log.d("initRecyclerView", "initRecyclerView - responseResult " + responseResult);

        int spanCount = 2;
        if(responseResult==null || responseResult== Resource.Status.SUCCESS) {
            spanCount = getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? 2 : 3;
        }

        GridLayoutManager mLayoutManager = new GridLayoutManager(getActivity(), spanCount);

        mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                 return mAdapter.getItemViewType(position) == 1 ? 1 : 2;            }
        });

        mRecyclerView.setLayoutManager(mLayoutManager);

        mHeader = getActivity().findViewById(R.id.failed_header);
        mText = getActivity().findViewById(R.id.failed_text);
        mButton = getActivity().findViewById(R.id.failed_retry);
        mImage = getActivity().findViewById(R.id.failed_image);
    }


   ............

}

这是 fragment_tasks.xml :

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.TasksFragment"
    >

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar"/>

    <androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:listitem="@layout/layout_category_list"
    android:paddingTop="?attr/actionBarSize"
    android:background="@color/background_dark"
    android:clipToPadding="false"
    android:contentDescription="@string/recycler"
    />

    <include
        android:id="@+id/failed"
        layout="@layout/layout_site_error"
        android:visibility="gone" />

</FrameLayout>

和完整的错误日志:

    java.lang.RuntimeException: Unable to resume activity {com.oxf.oxford/com.oxf.oxford.ui.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4536)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4572)
    at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:181)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:102)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2239)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:237)
    at android.app.ActivityThread.main(ActivityThread.java:7816)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1026)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
    at com.oxf.oxford.ui.TasksFragment.initRecyclerView(TasksFragment.java:221)
    at com.oxf.oxford.ui.TasksFragment.onViewCreated(TasksFragment.java:117)
    at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:332)

谢谢你的帮助 !

标签: javaandroid

解决方案


推荐阅读