Получение ошибки при получении представления RecyclerView в onActivityCreated () - PullRequest
1 голос
/ 20 февраля 2020

Я следую учебному пособию по Udemy с использованием RecyclerView с использованием фрагментов. Все работает нормально до этой строки 44 recyclerView = view.findViewById(R.id.rcl)

Я много искал на inte rnet, но не нашел никакого решения, связанного с этим. Я отладил код и просмотр был нулевым. Либо в этом уроке была проблема, либо только у меня проблема.

1- Fragment_list. xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".ListFrag">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rcl"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

2- ListFrag.jave

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_list, container, false);
    // Inflate the layout for this fragment
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    recyclerView = view.findViewById(R.id.rcl);
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this.getActivity());
    recyclerView.setLayoutManager(layoutManager);
    adapter = new PersonAdapter(this.getActivity(), ApplicationClass.people);
    recyclerView.setAdapter(adapter);
}

3- Это ошибка:

Error :
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference
            at com.example.recyclerfragments.ListFrag.onActivityCreated(ListFrag.java:44)
            at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2619)
            at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:904)
            at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
            at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
            at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659)
            at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
            at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
            at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
            at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
            at android.app.Activity.performStart(Activity.java:7214)
            at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3189)
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:185)
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:170)
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:147)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:73)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2031)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loop(Looper.java:224)
            at android.app.ActivityThread.main(ActivityThread.java:7083)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:536)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)

Ответы [ 3 ]

1 голос
/ 20 февраля 2020

Ошибка здесь:

recyclerView = view.findViewById(R.id.rcl);

view равно нулю.

Попробуйте заменить на:

private RecyclerView mRecyclerView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_list, container, false);
    // Add this.. Here, view won't be null
    recyclerView = view.findViewById(R.id.rcl);
    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // recyclerView = view.findViewById(R.id.rcl); --> Remove this from here.
    recyclerView.setHasFixedSize(true);
    layoutManager = new LinearLayoutManager(this.getActivity());
    recyclerView.setLayoutManager(layoutManager);
    adapter = new PersonAdapter(this.getActivity(), ApplicationClass.people);
    recyclerView.setAdapter(adapter);
}

Другая опция заменяет view на getActivity():

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    recyclerView = getActivity().findViewById(R.id.rcl);
    ....
}
1 голос
/ 20 февраля 2020

Вы инициализируете представление в onCreateView, но используете представление recyclerView = view.findViewById (R.id.rcl); в onActivityCreated именно поэтому вы получаете сообщение об ошибке.

Существует несколько способов устранения этой ошибки:

Первый:

private RecyclerView mRecyclerView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list, container, false);
        recyclerView = view.findViewById(R.id.rcl);

        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this.getActivity());
        recyclerView.setLayoutManager(layoutManager);
        adapter = new PersonAdapter(this.getActivity(), ApplicationClass.people);
        recyclerView.setAdapter(adapter);
        return view;
        }

Второй:

private RecyclerView mRecyclerView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_list, container, false);
        recyclerView = view.findViewById(R.id.rcl);
        return view;
        }

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this.getActivity());
        recyclerView.setLayoutManager(layoutManager);
        adapter = new PersonAdapter(this.getActivity(), ApplicationClass.people);
        recyclerView.setAdapter(adapter);
        }
1 голос
/ 20 февраля 2020

поместите ваш код в onViewCreated() это для kotlin, для java просто переопределите метод и вставьте в него свой код

убедитесь, что ваш объект просмотра объявлен глобально, поэтому он не будет null после представления создан

как это:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        recyclerView = view.findViewById(R.id.rcl)
        recyclerView.setHasFixedSize(true)
        layoutManager = LinearLayoutManager(this.activity)
        recyclerView.setLayoutManager(layoutManager)
        adapter = PersonAdapter(this.activity, ApplicationClass.people)
        recyclerView.setAdapter(adapter)
    }
...