在回收者视图中使用 onBindViewHolder 保留项目值
Keep item value using onBindViewHolder in recycler view
我在 RecyclerView
工作,我正在那里获取字符串列表。如果我单击它,我想保留特定 textView
的值,问题是当我向下滚动并再次出现时,它没有向我显示 TextView
上的单击值。我正在显示 "Selected",但是当我滚动并再次出现时,它显示了该字符串列表中的默认值。
我把我的代码和截图放在下面。
我的onBindViewHolder
代码:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder,final int position) {
final String parseObject = arrayList.get(position);
if (holder instanceof MemberViewHolder) {
if (arrayList.size() > 0) {
((MemberViewHolder) holder).txtTicket.setText(parseObject);
((MemberViewHolder) holder).txtTicket.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
((MemberViewHolder) holder).txtTicket.setText("Selected");
}
});
}
}
}
我选择的这些值:
这些随机选择的值显示我正在滚动,但我没有点击它们。
像这样创建pojo
class
public class Test {
public String value;
public boolean IsSelected;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public boolean isSelected() {
return IsSelected;
}
public void setSelected(boolean selected) {
IsSelected = selected;
}
}
现在创建那个 pojo 的 ArrayList
class
ArrayList<Test>arrayList= new ArrayList<>();
现在当您从服务器获取列表而不是像这样在 arraylist
中添加数据时
// add item in list like this when you get list from server
Test test= new Test();
test.setValue("value");
arrayList.add(test);
现在将 ArrayList
传递到您的适配器 class
当您单击 viewholder
中的任何项目时,不仅仅是在列表中设置布尔变量
例子
((MemberViewHolder) holder).txtTicket.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
((MemberViewHolder) holder).txtTicket.setText("Selected");
arrayList.get(position).setSelected(true);
}
});
当您在 Textview
中设置文本时,只需使用此条件
if(arrayList.get(position).isSelected()){
txtTicket.setText("Selected");
}else {
txtTicket.setText(arrayList.get(position).getValue());
}
当您再次向下和向上滚动时,您的 onBindViewHolder 方法将再次执行。您必须保存所选状态。例如:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder,final int position) {
final String parseObject = arrayList.get(position);
if (holder instanceof MemberViewHolder) {
if (arrayList.size() > 0) {
if ((Boolean)((MemberViewHolder) holder).txtTicket.getTag())) {
((MemberViewHolder) holder).txtTicket.setText("Selected");
} else{
((MemberViewHolder) holder).txtTicket.setText(parseObject);
}
((MemberViewHolder) holder).txtTicket.setText(parseObject);
((MemberViewHolder) holder).txtTicket.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
((MemberViewHolder) holder).txtTicket.setText("Selected");
((MemberViewHolder) holder).txtTicket.setTag(new Boolean(true));
}
});
}
}
}
在 txtTicket
的 onClick()
中添加以下行:
arrayList.set(position,"Selected");
Edit 在 onBindViewHolder()
方法中放入以下代码:
if (parseObject.equalsIgnoreCase("Selected")) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
}
取一个 pojo class,它具有如下代码所示的字符串和布尔值..
public class Data {
private String value;
private boolean selectedFlag;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public boolean isSelectedFlag() {
return selectedFlag;
}
public void setSelectedFlag(boolean selectedFlag) {
this.selectedFlag = selectedFlag;
}
}
并将此 pojo class 传递到适配器中,并为 handel click 事件创建接口,如下面的代码..
List<Data> mDataList = new ArrayList<>();// hear you can pass any pojo class object.
onItemClickListner onItemClickListner;
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
this.onItemClickListner = onItemClickListner;
}
public interface onItemClickListner {
void onClick(Data str);//pass your object types.
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
Data data = mStringList.get(position); // if you pass object of class then create that class object.
if (data.isSelectedFlag()) {
holder.textView.setText("Selected");
}
// below code handle click event on recycler view item.
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListner.onClick(data);
}
});
}
在 activity 适配器绑定到下面代码中使用的回收器视图后..
recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
@Override
public void onClick(Data str) {
str.setSelectedFlag(true);
recyclerViewAdpater.notifyDataSetChanged();
}
});
你需要一个 pojo class,
public class Pojo{
String id;
private boolean isSelected;
public Pojo(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}
首先定位setTag,
holder.txtTicket.setTag(position);
holder.txtTicket.setSelected(arrayList.get(position).isSelectedFlag());
final int pos = position;
holder.txtTicket.setTag(arrayList.get(position));
然后在 onClick 事件中放这个,
Pojo pojo = (Pojo) txtTicket.getTag();
pojo.setSelected(txtTicket.isSelected());
我在 RecyclerView
工作,我正在那里获取字符串列表。如果我单击它,我想保留特定 textView
的值,问题是当我向下滚动并再次出现时,它没有向我显示 TextView
上的单击值。我正在显示 "Selected",但是当我滚动并再次出现时,它显示了该字符串列表中的默认值。
我把我的代码和截图放在下面。
我的onBindViewHolder
代码:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder,final int position) {
final String parseObject = arrayList.get(position);
if (holder instanceof MemberViewHolder) {
if (arrayList.size() > 0) {
((MemberViewHolder) holder).txtTicket.setText(parseObject);
((MemberViewHolder) holder).txtTicket.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
((MemberViewHolder) holder).txtTicket.setText("Selected");
}
});
}
}
}
我选择的这些值:
这些随机选择的值显示我正在滚动,但我没有点击它们。
像这样创建pojo
class
public class Test {
public String value;
public boolean IsSelected;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public boolean isSelected() {
return IsSelected;
}
public void setSelected(boolean selected) {
IsSelected = selected;
}
}
现在创建那个 pojo 的 ArrayList
class
ArrayList<Test>arrayList= new ArrayList<>();
现在当您从服务器获取列表而不是像这样在 arraylist
中添加数据时
// add item in list like this when you get list from server
Test test= new Test();
test.setValue("value");
arrayList.add(test);
现在将 ArrayList
传递到您的适配器 class
当您单击 viewholder
中的任何项目时,不仅仅是在列表中设置布尔变量
例子
((MemberViewHolder) holder).txtTicket.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
((MemberViewHolder) holder).txtTicket.setText("Selected");
arrayList.get(position).setSelected(true);
}
});
当您在 Textview
中设置文本时,只需使用此条件
if(arrayList.get(position).isSelected()){
txtTicket.setText("Selected");
}else {
txtTicket.setText(arrayList.get(position).getValue());
}
当您再次向下和向上滚动时,您的 onBindViewHolder 方法将再次执行。您必须保存所选状态。例如:
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder,final int position) {
final String parseObject = arrayList.get(position);
if (holder instanceof MemberViewHolder) {
if (arrayList.size() > 0) {
if ((Boolean)((MemberViewHolder) holder).txtTicket.getTag())) {
((MemberViewHolder) holder).txtTicket.setText("Selected");
} else{
((MemberViewHolder) holder).txtTicket.setText(parseObject);
}
((MemberViewHolder) holder).txtTicket.setText(parseObject);
((MemberViewHolder) holder).txtTicket.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
((MemberViewHolder) holder).txtTicket.setText("Selected");
((MemberViewHolder) holder).txtTicket.setTag(new Boolean(true));
}
});
}
}
}
在 txtTicket
的 onClick()
中添加以下行:
arrayList.set(position,"Selected");
Edit 在 onBindViewHolder()
方法中放入以下代码:
if (parseObject.equalsIgnoreCase("Selected")) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
}
取一个 pojo class,它具有如下代码所示的字符串和布尔值..
public class Data {
private String value;
private boolean selectedFlag;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public boolean isSelectedFlag() {
return selectedFlag;
}
public void setSelectedFlag(boolean selectedFlag) {
this.selectedFlag = selectedFlag;
}
}
并将此 pojo class 传递到适配器中,并为 handel click 事件创建接口,如下面的代码..
List<Data> mDataList = new ArrayList<>();// hear you can pass any pojo class object.
onItemClickListner onItemClickListner;
public void setOnItemClickListner(RecyclerViewAdpater.onItemClickListner onItemClickListner) {
this.onItemClickListner = onItemClickListner;
}
public interface onItemClickListner {
void onClick(Data str);//pass your object types.
}
@Override
public void onBindViewHolder(ItemViewHolder holder, int position) {
Data data = mStringList.get(position); // if you pass object of class then create that class object.
if (data.isSelectedFlag()) {
holder.textView.setText("Selected");
}
// below code handle click event on recycler view item.
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onItemClickListner.onClick(data);
}
});
}
在 activity 适配器绑定到下面代码中使用的回收器视图后..
recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
@Override
public void onClick(Data str) {
str.setSelectedFlag(true);
recyclerViewAdpater.notifyDataSetChanged();
}
});
你需要一个 pojo class,
public class Pojo{
String id;
private boolean isSelected;
public Pojo(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
}
首先定位setTag,
holder.txtTicket.setTag(position);
holder.txtTicket.setSelected(arrayList.get(position).isSelectedFlag());
final int pos = position;
holder.txtTicket.setTag(arrayList.get(position));
然后在 onClick 事件中放这个,
Pojo pojo = (Pojo) txtTicket.getTag();
pojo.setSelected(txtTicket.isSelected());