繁体   English   中英

在回收站视图中使用onBindViewHolder保持商品价值

[英]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");
                }
            });

        }
}
}

我选择的这些值:

图片1

这些随机选择的值显示了正在滚动的内容,但是我没有单击它们。

图片2

创建像这样的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM