Android RecyclerView: попытка вызвать виртуальный метод void androidx.recyclerview.widget.RecyclerView.setAdapter() для нулевой ссылки на объект

Я попытался создать RecyclerView для фрагмента с пользовательским макетом, поэтому я использовал адаптер, но когда я попытался установить адаптер, я получил следующие ошибки:

java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference

Я пробовал некоторые решения в Интернете, все предлагают попробовать найти recyclerview внутри OnViewCreated. Но мой код все еще не может найти recyclerview внутри файла макета.

Это мой файл fragment_hadiah.xml

<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"
    tools:context = ".HadiahFragment"
    android:orientation = "vertical">

    <LinearLayout
        android:layout_width = "match_parent"
        android:padding = "20dp"
        android:layout_height = "wrap_content"
        android:orientation = "vertical">

        <LinearLayout
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:orientation = "horizontal">

            <ImageView
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:src = "@drawable/ic_video"/>

            <TextView
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:text = "x Dopa Eggs"
                android:textSize = "20sp"
                android:textStyle = "bold"
                android:layout_marginStart = "10dp"/>
        </LinearLayout>

        <TextView
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content"
            android:text = "Tukarkan pointmu"/>
    </LinearLayout>

    <HorizontalScrollView
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content">

        <LinearLayout
            android:layout_width = "wrap_content"
            android:layout_height = "match_parent"
            android:orientation = "horizontal"
            android:paddingVertical = "10dp">

            <Button
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:text = "GOPAY"
                android:layout_marginLeft = "20dp"/>

            <Button
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:text = "OVO"
                android:layout_marginLeft = "20dp"/>

            <Button
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:text = "DANA"
                android:layout_marginLeft = "20dp"/>

            <Button
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:text = "Coming Soon"
                android:layout_marginLeft = "20dp"/>

            <Button
                android:layout_width = "wrap_content"
                android:layout_height = "wrap_content"
                android:text = "Coming Soon"
                android:layout_marginLeft = "20dp"/>

        </LinearLayout>
    </HorizontalScrollView>

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

</LinearLayout>

Вот мой класс HadiahFragment.java

package com.dopami.projecthatchedeggs;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.dopami.projecthatchedeggs.adapter.HadiahItemAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link HadiahFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class HadiahFragment extends Fragment {

    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String mParam1;
    private String mParam2;

    RecyclerView hadiahRecyclerView;

    public HadiahFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment HadiahFragment.
     */
    public static HadiahFragment newInstance(String param1, String param2) {
        HadiahFragment fragment = new HadiahFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

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

        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        List<String> itemList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            itemList.add(String.valueOf(i));
        }

        Toast.makeText((HomeActivity) getActivity(), "OK", Toast.LENGTH_SHORT).show();

        hadiahRecyclerView = view.findViewById(R.id.hadiahRecylerView);
        HadiahItemAdapter itemAdapter = new HadiahItemAdapter(itemList, (HomeActivity) getActivity());
        GridLayoutManager gridLayoutManager = new GridLayoutManager((HomeActivity)getActivity(), 2);
        hadiahRecyclerView.setAdapter(itemAdapter);
        hadiahRecyclerView.setLayoutManager(gridLayoutManager);
    }
}

Вот мой класс HadiahItemAdapter.java

package com.dopami.projecthatchedeggs.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.cardview.widget.CardView;
import androidx.recyclerview.widget.RecyclerView;

import com.dopami.projecthatchedeggs.R;

import java.util.List;

public class HadiahItemAdapter extends RecyclerView.Adapter<HadiahItemAdapter.ItemViewHolder>{

    private List<String> mItemList;
    private Context mContext;

    public HadiahItemAdapter(List<String> mItemList, Context mContext) {
        this.mItemList = mItemList;
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hadiah_card_item, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        String item = mItemList.get(position);
        holder.textView.setText(item);
    }

    @Override
    public int getItemCount() {
        return mItemList.size();
    }

    class ItemViewHolder extends RecyclerView.ViewHolder{

        private CardView cardView;
        private TextView textView;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);

            cardView = itemView.findViewById(R.id.hadiahCardView);
            textView = itemView.findViewById(R.id.hadiahCardTextView);
        }
    }
}

С нетерпением жду решений от вас, ребята, спасибо за помощь...

Ты надуваешь R.layout.fragment_beranda пока у тебя recyclerview внутри R.layout.fragment_hadiah .. Почему так ?

ADM 29.03.2022 09:42

Отвечает ли это на ваш вопрос? Что такое исключение NullPointerException и как его исправить?

cmak 29.03.2022 09:55

Ага, не понял, что надуваю не тот макет, теперь исправил :)

Regn 29.03.2022 10:00

@Regn, почему вы не используете привязку представления? Больше не делаю findViewById()!!!

Sambhav. K 31.03.2022 17:42

@ Sambhav.K Вау, для меня это звучит ново, у вас есть ссылки или руководство о том, как это сделать? Большое спасибо за идею

Regn 01.04.2022 06:30

См. это

Sambhav. K 01.04.2022 06:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш фрагмент раздувает XML следующим образом:

View view =  inflater.inflate(R.layout.fragment_beranda, container, false);

R.layout.fragment_beranda — это не тот макет, который вам нужен (или общий fragment_hadiah.xml).

Поэтому в onViewCreated

hadiahRecyclerView = view.findViewById(R.id.hadiahRecylerView);
HadiahItemAdapter itemAdapter = new HadiahItemAdapter(itemList, (HomeActivity) getActivity());
GridLayoutManager gridLayoutManager = new GridLayoutManager((HomeActivity)getActivity(), 2);
hadiahRecyclerView.setAdapter(itemAdapter);

hadiahRecyclerView не существует в файле XML, поэтому переменная hadiahRecyclerView имеет значение null

значение

hadiahRecyclerView.setAdapter(itemAdapter);

эта строка вылетает с NullPointerException

Ошибка трассировки стека, которой вы поделились, говорит именно об этом:

java.lang.NullPointerException: Attempt to invoke virtual method

'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)'

on a null object reference

Привет, Бланделл, спасибо за ответ, эти простые опечатки действительно застают меня врасплох, спасибо за исправление. Я даже не знал, что я надуваю неправильный макет. Это почти занимает у меня час, чтобы исправить. Большое спасибо... :))

Regn 29.03.2022 09:49

Без проблем. Когда вы получаете исключение нулевого указателя для переменной, которая является результатом findViewById, это означает, что идентификатор XML не может быть найден, что обычно означает, что вы не увеличиваете файл XML, содержащий этот идентификатор.

Blundell 29.03.2022 09:51

Понятно! ??...

Regn 29.03.2022 09:58

Другие вопросы по теме