简体   繁体   English

为什么我的应用程序在片段内使用回收器视图时崩溃?

[英]Why is my app crashing when using a recycler view inside a fragment?

Code for fragment:片段代码:


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

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

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

public class ListingsActivity extends Fragment {

    RecyclerView recyclerView;
    LinearLayoutManager layoutManager;
    List<ModelClass> itemList = new ArrayList<>();
    Adapter adapter;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // Initialize recycler view
        initData();
        initRecyclerView();
        return inflater.inflate(R.layout.activity_listings, container, false);
    }

    // Add and remove data
    private void initData() {
        itemList.add(new ModelClass(R.drawable.placeholder2, "Bottle","Gently used bottle with replaceable nib", "$10", "Abdallah", "24/05/2002",R.drawable.seperator_line));
        itemList.add(new ModelClass(R.drawable.placeholder2, "Bottle","Gently used bottle with replaceable nib", "$10", "Abdallah", "24/05/2002", R.drawable.seperator_line));
        itemList.add(new ModelClass(R.drawable.placeholder2, "Bottle","Gently used bottle with replaceable nib", "$10", "Abdallah", "24/05/2002", R.drawable.seperator_line));
    }

    // Initialize recyclerView function
    private void initRecyclerView() {
        recyclerView = (RecyclerView) getView().findViewById(R.id.listings_container);
        layoutManager = new LinearLayoutManager(getActivity());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        adapter = new Adapter(itemList);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

    }


}

Code for adapter:适配器代码:

package com.jamdev.handmedown;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

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

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

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

    private List<ModelClass> itemList = new ArrayList<>();

    public Adapter(List<ModelClass> itemList){
        this.itemList = itemList;
    }

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

    @Override
    public void onBindViewHolder(@NonNull Adapter.ViewHolder holder, int position) {

        int resource = itemList.get(position).getListing_pic();
        String title = itemList.get(position).getListing_title();
        String description = itemList.get(position).getListing_description();
        String price = itemList.get(position).getListing_price();
        String owner = itemList.get(position).getListing_owner();
        String date = itemList.get(position).getListing_date();
        int divider = itemList.get(position).getSeperator();

        holder.setData(resource,title,description,price,owner,date,divider);

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        private ImageView listing_pic;
        private TextView listing_title;
        private TextView listing_description;
        private TextView listing_price;
        private TextView listing_owner;
        private TextView listing_date;
        private ImageView seperator;

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

            listing_pic = itemView.findViewById(R.id.listing_pic);
            listing_title = itemView.findViewById(R.id.listing_title);
            listing_description = itemView.findViewById(R.id.listing_description);
            listing_price = itemView.findViewById(R.id.listing_price);
            listing_owner = itemView.findViewById(R.id.listing_owner);
            listing_date = itemView.findViewById(R.id.listing_date);
            seperator = itemView.findViewById(R.id.seperator);

        }

        public void setData(int resource, String title, String description, String price, String owner, String date, int divider) {
            listing_pic.setImageResource(resource);
            listing_title.setText(title);
            listing_description.setText(description);
            listing_price.setText(price);
            listing_owner.setText(owner);
            listing_date.setText(date);
            seperator.setImageResource(divider);
        }
    }
}

Commenting the initRecyclerView() out won't make it crash, and opening the layout alone without commenting out initRecyclerView without the use of a fragment won't make it crash, but no items are displayed.将 initRecyclerView() 注释掉不会使其崩溃,单独打开布局而不注释掉 initRecyclerView 而不使用片段不会使其崩溃,但不会显示任何项目。 So i have the issue of 1. Crashing when used with fragments 2. Not displaying the items when not used in a fragment所以我有以下问题 1. 与片段一起使用时崩溃 2. 不在片段中使用时不显示项目

Would greatly appreciate your help非常感谢您的帮助

You're calling getView() too early in your initRecyclerView() .您在initRecyclerView()中调用getView()的时间过早。

getView() returns whatever onCreateView() returned and your onCreateView() has not yet completed. getView()返回onCreateView() ) 返回的任何内容,而您的onCreateView()尚未完成。 Hence getView() returns null and attempting to call a method on that return value will NPE.因此getView()返回 null 并且尝试对该返回值调用方法将 NPE。

You can move the initRecyclerView() to onViewCreated() to fix that issue.您可以将initRecyclerView()移至onViewCreated()以解决该问题。

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

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