[英]Keep item value using onBindViewHolder in recycler view
我在RecyclerView
中工作,在那里我獲取了字符串列表。 如果要單擊它,我想保留特定textView
的值,問題是當我向下滾動並再次彈出時,它沒有顯示單擊那個TextView
值。 我正在顯示“已選擇”,但是當我滾動並再次進入時,它正在顯示該字符串列表中的默認值。
我將代碼和屏幕截圖放在下面。
我的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
類
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
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
當您單擊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());
}
txtTicket
添加到txtTicket
onClick()
中:
arrayList.set(position,"Selected");
在onBindViewHolder()
方法中編輯以下代碼:
if (parseObject.equalsIgnoreCase("Selected")) {
((MemberViewHolder) holder).txtTicket.setTextColor(R.color.red_theme);
}
當您再次上下滾動時,將再次執行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));
}
});
}
}
}
像下面的代碼一樣,獲取一個具有字符串和布爾值的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;
}
}
並將此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);
}
});
}
在活動中,將適配器綁定到下面的代碼后使用的回收站視圖中。
recyclerViewAdpater.setOnItemClickListner(new RecyclerViewAdpater.onItemClickListner() {
@Override
public void onClick(Data str) {
str.setSelectedFlag(true);
recyclerViewAdpater.notifyDataSetChanged();
}
});
你需要一堂課
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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.