如何在 RecyclerView 中保持 ViewHolder 的状态
How to keep the status of the ViewHolder in RecyclerView
我有一个包含一些网格单元格的 RecyclerView。单击我按钮上方有一个 TextView。我将显示一些内容,例如单击按钮时 TextView 中的名称。我的问题是 TextView 中的文本不持久。
这是我在 MainActivity 中的代码:
private void initializeData(){
persons = new ArrayList<>();
persons.add(new Person("Name 1", "23 years old", R.drawable.a));
persons.add(new Person("Name 2", "25 years old", R.drawable.b));
persons.add(new Person("Name 3", "35 years old", R.drawable.c));
persons.add(new Person("Name 4", "35 years old", R.drawable.c));
persons.add(new Person("Name 5", "35 years old", R.drawable.c));
persons.add(new Person("Name 6", "35 years old", R.drawable.c));
persons.add(new Person("Name 7", "35 years old", R.drawable.c));
persons.add(new Person("Name 8", "35 years old", R.drawable.c));
persons.add(new Person("Name 9", "35 years old", R.drawable.c));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
recyclerView.setHasFixedSize(true);
layoutManager = new GridLayoutManager(this, 1, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
persons = new ArrayList<>();
initializeData();
RVAdapter adapter = new RVAdapter(persons);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
我的适配器中的代码:
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder>{
List<Person> persons;
RVAdapter(List<Person> persons){
this.persons = persons;
}
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cards_layout, viewGroup, false);
PersonViewHolder pvh = new PersonViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
personViewHolder.personName.setText(persons.get(i).name);
personViewHolder.personAge.setText(persons.get(i).age);
personViewHolder.personPhoto.setImageResource(persons.get(i).photoId);
final PersonViewHolder vh = personViewHolder;
personViewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vh.textView.setText(vh.personName.getText().toString());
}
});
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public int getItemCount() {
return persons.size();
}
public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
public TextView personName;
public TextView personAge;
ImageView personPhoto;
public TextView textView;
public Button button;
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);
textView = (TextView)itemView.findViewById(R.id.text);
button = (Button)itemView.findViewById(R.id.button);
}
}
}
我认为原因是重新创建了 ViewHolder。遇到这种情况怎么办?谢谢
将布尔字段添加到每个单元格对应的对象中,并在用户单击按钮时将此值设置为 true,然后将逻辑添加到 onBindViewHolder()
方法中:
if (clicked) {
showText();
} else {
hideText();
}
同时将 OnClickListener 中的 vh.textView.setText(vh.personName.getText().toString());
更改为 personViewHolder.personName.setText(persons.get(i).name);
- 您必须仅通过使用 List<Person> persons
来保留和请求数据,而不是来自 ViewHolder,因为适配器会重用视图,并且当您'将从 ViewHolder 请求数据,您将获得以前膨胀的数据 Views
您可以将布尔值 isShowName
添加到您的模型 Person
,然后在您的 onBindViewHolder()
方法中:
...
personViewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vh.textView.setText(vh.personName.getText().toString());
persons.get(i).setIsShowName(true); // don't forget!
}
});
if (persons.get(i).isShowName()) {
vh.textView.setText(vh.personName.getText().toString());
} else {
vh.textView.setText("");
}
我有一个包含一些网格单元格的 RecyclerView。单击我按钮上方有一个 TextView。我将显示一些内容,例如单击按钮时 TextView 中的名称。我的问题是 TextView 中的文本不持久。
这是我在 MainActivity 中的代码:
private void initializeData(){
persons = new ArrayList<>();
persons.add(new Person("Name 1", "23 years old", R.drawable.a));
persons.add(new Person("Name 2", "25 years old", R.drawable.b));
persons.add(new Person("Name 3", "35 years old", R.drawable.c));
persons.add(new Person("Name 4", "35 years old", R.drawable.c));
persons.add(new Person("Name 5", "35 years old", R.drawable.c));
persons.add(new Person("Name 6", "35 years old", R.drawable.c));
persons.add(new Person("Name 7", "35 years old", R.drawable.c));
persons.add(new Person("Name 8", "35 years old", R.drawable.c));
persons.add(new Person("Name 9", "35 years old", R.drawable.c));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
recyclerView.setHasFixedSize(true);
layoutManager = new GridLayoutManager(this, 1, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
persons = new ArrayList<>();
initializeData();
RVAdapter adapter = new RVAdapter(persons);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
我的适配器中的代码:
public class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder>{
List<Person> persons;
RVAdapter(List<Person> persons){
this.persons = persons;
}
@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cards_layout, viewGroup, false);
PersonViewHolder pvh = new PersonViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
personViewHolder.personName.setText(persons.get(i).name);
personViewHolder.personAge.setText(persons.get(i).age);
personViewHolder.personPhoto.setImageResource(persons.get(i).photoId);
final PersonViewHolder vh = personViewHolder;
personViewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vh.textView.setText(vh.personName.getText().toString());
}
});
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public int getItemCount() {
return persons.size();
}
public static class PersonViewHolder extends RecyclerView.ViewHolder {
CardView cv;
public TextView personName;
public TextView personAge;
ImageView personPhoto;
public TextView textView;
public Button button;
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);
textView = (TextView)itemView.findViewById(R.id.text);
button = (Button)itemView.findViewById(R.id.button);
}
}
}
我认为原因是重新创建了 ViewHolder。遇到这种情况怎么办?谢谢
将布尔字段添加到每个单元格对应的对象中,并在用户单击按钮时将此值设置为 true,然后将逻辑添加到 onBindViewHolder()
方法中:
if (clicked) {
showText();
} else {
hideText();
}
同时将 OnClickListener 中的 vh.textView.setText(vh.personName.getText().toString());
更改为 personViewHolder.personName.setText(persons.get(i).name);
- 您必须仅通过使用 List<Person> persons
来保留和请求数据,而不是来自 ViewHolder,因为适配器会重用视图,并且当您'将从 ViewHolder 请求数据,您将获得以前膨胀的数据 Views
您可以将布尔值 isShowName
添加到您的模型 Person
,然后在您的 onBindViewHolder()
方法中:
...
personViewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
vh.textView.setText(vh.personName.getText().toString());
persons.get(i).setIsShowName(true); // don't forget!
}
});
if (persons.get(i).isShowName()) {
vh.textView.setText(vh.personName.getText().toString());
} else {
vh.textView.setText("");
}