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;
}
}
谢谢
当您 inflate
在 onCreateView()
中创建 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.rv
在 R.layout.fragment_home
内,您应该将该行替换为:
rv=(RecyclerView) layout.findViewById(R.id.rv);
.
每当我尝试访问使用 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;
}
}
谢谢
当您 inflate
在 onCreateView()
中创建 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.rv
在 R.layout.fragment_home
内,您应该将该行替换为:rv=(RecyclerView) layout.findViewById(R.id.rv);
.