简体   繁体   English

在片段内使用回收器视图时出错

[英]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我正在尝试在我的仪表板片段中使用回收器视图,但是当我尝试运行该应用程序并在 logcat 窗口中显示此错误时该应用程序崩溃 ->尝试调用虚拟方法 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx .recyclerview.widget.RecyclerView$LayoutManager)' 在空对象引用上

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 代码

<?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> </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.在 onViewCreated() 方法中编写代码以获取布局的所有组件。

You have placed your code in wrong method().您将代码放在错误的方法()中。 Remove below code from onCreatview().从 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.覆盖片段中的 onViewCreated() 方法并将上面的代码复制并粘贴到其中。

You should inflate the view before to get its RecyclerView.您应该先膨胀视图以获取其 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.).建议:您应该以驼峰格式命名您的类(DashboardFragment、DashboardRecyclerAdapter 等)。 In fragments use resquiredContext and requiredActivity when you wants context or activity.当您需要上下文或活动时,在片段中使用 resquiredContext 和 requiredActivity 。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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