简体   繁体   中英

Error while using recycler view inside a fragment

I am trying to use a recycler view inside my dashboard fragment but the app crashes when I try to run the app and shows this error in logcat window -> Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference

This is my fragment code

package com.example.bookhub;
import android.content.Context;
import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.Arrays;
import java.util.List;

public class Dashboard_Fragment extends Fragment {

RecyclerView Recycler;
RecyclerView.LayoutManager layoutManager;
Dashboard_Recycler_Adapter recyclerAdapter;
List<String> bookList = Arrays.asList(
        "P.S. I love You",
        "The Great Gatsby",
        "Anna Karenina",
        "Madame Bovary",
        "War & Peace",
        "Middlemarch",
        "The Adventures of Huckleberry Finn",
        "Moby-Dick",
        "The Lord of the Rings");

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    Recycler = getActivity().findViewById(R.id.Recycler);

    layoutManager = new LinearLayoutManager(getActivity());

    recyclerAdapter = new Dashboard_Recycler_Adapter((Context) getActivity(),bookList);

    Recycler.setLayoutManager(layoutManager);
    Recycler.setAdapter(recyclerAdapter);

    return inflater.inflate(R.layout.fragment_dashboard, container, false);
}

}

This is the code for adapter

package com.example.bookhub;

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.recyclerview.widget.RecyclerView;

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

public class Dashboard_Recycler_Adapter extends 
RecyclerView.Adapter<Dashboard_Recycler_Adapter.DashboardViewHolder>{

List<String> bookList;
public Dashboard_Recycler_Adapter(Context context, List<String> list)
{
    this.bookList = list;
}


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

@Override
public void onBindViewHolder(@NonNull DashboardViewHolder holder, int position)
{
    holder.textView.setText(bookList.get(position));
}

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

public static class DashboardViewHolder extends RecyclerView.ViewHolder
{
    TextView textView;
    public DashboardViewHolder(@NonNull View itemView) {
        super(itemView);

        textView = itemView.findViewById(R.id.txtRecyclerRowItem);
    }
}

}

This is the XML Code of the recycler view in the dashboard fragment

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Dashboard_Fragment">

<!-- TODO: Update blank fragment layout -->
<TextView
    android:id="@+id/textView2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    android:text="@string/dashboard_fragment"
    android:textSize="20sp" />

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/Recycler"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="35dp"
    android:padding="10dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.088"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.075" />

</androidx.constraintlayout.widget.ConstraintLayout>

Your layout has not been inflated and you are using it before. Means Layout creation is not completed and you are using it before that. Write your code in onViewCreated() method to get all component of layout.

You have placed your code in wrong method(). Remove below code from onCreatview().

Recycler = getActivity().findViewById(R.id.Recycler);

layoutManager = new LinearLayoutManager(getActivity());

recyclerAdapter = new Dashboard_Recycler_Adapter((Context) 
getActivity(),bookList);

Recycler.setLayoutManager(layoutManager);
Recycler.setAdapter(recyclerAdapter);

Override onViewCreated() method in fragment and copy and paste above code into that.

You should inflate the view before to get its RecyclerView.

import java.util.Arrays;
import java.util.List;

public class Dashboard_Fragment extends Fragment {

    RecyclerView recycler;
    
    Dashboard_Recycler_Adapter recyclerAdapter;
    List<String> books= Arrays.asList(
        "P.S. I love You",
        "The Great Gatsby",
        "Anna Karenina",
        "Madame Bovary",
        "War & Peace",
        "Middlemarch",
        "The Adventures of Huckleberry Finn",
        "Moby-Dick",
        "The Lord of the Rings");

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_dashboard, container, false);

        recycler = view.findViewById(R.id.Recycler);

        recyclerAdapter = new Dashboard_Recycler_Adapter(requiredContext(), books);

        recycler.setLayoutManager(new LinearLayoutManager(requiredActivity()));
        recycler.setAdapter(recyclerAdapter);

        return view;
    }
}

Advices : you should name your classes in camel case format (DashboardFragment, DashboardRecyclerAdapter etc.). In fragments use resquiredContext and requiredActivity when you wants context or activity.

Change this line

RecyclerView Recycler;

to this

RecyclerView recycler;

and also this line

Recycler = getActivity().findViewById(R.id.Recycler);

to this

recycler= getActivity().findViewById(R.id.Recycler);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM