Android 片段中的 RecyclerView LayoutManager 异常

Android RecyclerView LayoutManager Exception in Fragment

每当我尝试访问使用 RecyclerView 显示卡片视图的片段时,我的应用程序就会崩溃。该应用程序适用于单个 activity,但不适用于片段。我收到此错误

Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)

请帮忙。 这是 Recyclerfragment

public class RecyclerViewActivity extends android.support.v4.app.Fragment {

private List<Person> persons;
private RecyclerView rv;
private Context context;
private RVAdapter adapter;

public RecyclerViewActivity()
{

}

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View layout= inflater.inflate(R.layout.fragment_home, container, false);
    rv=(RecyclerView)getActivity().findViewById(R.id.rv);
    adapter = new RVAdapter(getActivity(),initializeData());
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    rv.setLayoutManager(layoutManager);
    rv.setAdapter(adapter);

    return layout;
}


private static List<Person> initializeData(){
    List<Person> persons = new ArrayList<>();
    persons.add(new Person("Emma Wilson", "23 years old", R.drawable.emma));
    persons.add(new Person("Lavery Maiss", "25 years old", R.drawable.lavery));
    persons.add(new Person("Lillie Watts", "35 years old", R.drawable.lillie));


  return persons;
}


}

这是适配器

Public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder>{

private LayoutInflater inflater;
List<Person> data = Collections.emptyList();

public  RVAdapter(Context context,List<Person> data)
{
    inflater= LayoutInflater.from(context);
    this.data=data;

}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
   //View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    View v= inflater.inflate(R.layout.item, viewGroup,false);
    PersonViewHolder pvh = new PersonViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
    personViewHolder.personName.setText(data.get(i).name);
    personViewHolder.personAge.setText(data.get(i).age);
    personViewHolder.personPhoto.setImageResource(data.get(i).photoId);
}

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

public static class PersonViewHolder extends RecyclerView.ViewHolder {

    CardView cv;
    TextView personName;
    TextView personAge;
    ImageView personPhoto;

    PersonViewHolder(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        personName = (TextView)itemView.findViewById(R.id.person_name);
        personAge = (TextView)itemView.findViewById(R.id.person_age);
        personPhoto = (ImageView)itemView.findViewById(R.id.person_photo);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(),personName.getText(),Toast.LENGTH_LONG).show();

            }
        });
    }
}
}

这里是我要添加的 Persons 对象。

class Person {
String name;
String age;
int photoId;




Person(String name, String age, int photoId) {
    this.name = name;
    this.age = age;
    this.photoId = photoId;
    }
}

谢谢

当您 inflateonCreateView() 中创建 layout 文件时,您应该在返回的 View 上使用 findViewById()

考虑到这一点,尝试将 rv=(RecyclerView)getActivity().findViewById(R.id.rv); 切换为 rv=(RecyclerView) layout.findViewById(R.id.rv);

rv=(RecyclerView)getActivity().findViewById(R.id.rv);
这是你的问题。您在 Activity 上调用 findViewById() 并且 activity 在其布局中找不到您的 R.id.rv 并且返回空值。假设 R.id.rvR.layout.fragment_home 内,您应该将该行替换为:
rv=(RecyclerView) layout.findViewById(R.id.rv);.