簡體   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