[英]Keep item value using onBindViewHolder in recycler view
I am working in RecyclerView
where I am getting a list of Strings. 我在
RecyclerView
中工作,在那里我获取了字符串列表。 I want to keep the value of particular textView
if I am clicking on it, problem is that when I am scrolling down and coming Up again, it is not showing me that clicked value on that TextView
. 如果要单击它,我想保留特定
textView
的值,问题是当我向下滚动并再次弹出时,它没有显示单击那个TextView
值。 I am displaying "Selected", but when I am scrolling and coming again it is showing me default value from that Strings list. 我正在显示“已选择”,但是当我滚动并再次进入时,它正在显示该字符串列表中的默认值。
I am putting my code and my screenshot below. 我将代码和屏幕截图放在下面。
My onBindViewHolder
code: 我的
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");
}
});
}
}
}
These Values I am selecting: 我选择的这些值:
These random selected values are showing which I am getting on scrolling, but I didn't clicked them. 这些随机选择的值显示了正在滚动的内容,但是我没有单击它们。
Create pojo
class like this 创建像这样的
pojo
类
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;
}
}
now Create the ArrayList
of that pojo class 现在创建该pojo类的
ArrayList
ArrayList<Test>arrayList= new ArrayList<>();
now when you get list from server than add data in arraylist
like this 现在,当您从服务器获取列表而不是像这样在
arraylist
添加数据时
// add item in list like this when you get list from server
Test test= new Test();
test.setValue("value");
arrayList.add(test);
Now pass the ArrayList
in your adapter class 现在在您的适配器类中传递
ArrayList
when you click any item in viewholder
than just set boolean variable in your list 当您单击
viewholder
任何项目时,不只是在列表中设置布尔变量
Example 例
((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);
}
});
When you set text inside Textview
just use this condition 当您在
Textview
设置文本时,只需使用此条件
if(arrayList.get(position).isSelected()){
txtTicket.setText("Selected");
}else {
txtTicket.setText(arrayList.get(position).getValue());
}
Add the below line in onClick()
of txtTicket
: txtTicket
添加到txtTicket
onClick()
中:
arrayList.set(position,"Selected");
Edit put below code in onBindViewHolder()
method: 在
onBindViewHolder()
方法中编辑以下代码:
if (parseObject.equalsIgnoreCase("Selected")) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
}
When you scroll down and up again your onBindViewHolder method will be executed again. 当您再次上下滚动时,将再次执行onBindViewHolder方法。 You have to save the selected state.
您必须保存所选状态。 For example:
例如:
@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));
}
});
}
}
}
Take one pojo class that has string and boolean value like below code.. 像下面的代码一样,获取一个具有字符串和布尔值的pojo类。
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;
}
} }
and pass this pojo class into adapter in and make interface to handel click event like below code .. 并将此pojo类传递到adapter中,并创建接口来处理单击事件,如下面的代码..
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);
}
});
}
In activity after adapter bind into recycler view used below code.. 在活动中,将适配器绑定到下面的代码后使用的回收站视图中。
recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
@Override
public void onClick(Data str) {
str.setSelectedFlag(true);
recyclerViewAdpater.notifyDataSetChanged();
}
});
You need one 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;
}
}
Firstly position setTag, 首先定位setTag,
holder.txtTicket.setTag(position);
holder.txtTicket.setSelected(arrayList.get(position).isSelectedFlag());
final int pos = position;
holder.txtTicket.setTag(arrayList.get(position));
then in onClick event put this, 然后在onClick事件中,
Pojo pojo = (Pojo) txtTicket.getTag();
pojo.setSelected(txtTicket.isSelected());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.