在回收者视图中使用 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");
                }
            });

        }
}
}

我选择的这些值:

这些随机选择的值显示我正在滚动,但我没有点击它们。

像这样创建pojoclass

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));

                }
            });

        }
    }
}

txtTicketonClick() 中添加以下行:

arrayList.set(position,"Selected");

EditonBindViewHolder() 方法中放入以下代码:

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());