首页 > 解决方案 > 尽管存储了 RecyclerView,但它仍丢失 Checkbox 状态

问题描述

我读到您必须存储项目的状态并再次设置它,因为它会从 RAM 中清除。对我来说,如果我继续在更长的列表(10-15 项)中上下滚动,随机检查将出现和消失。下面是我如何存储和设置它。我应该与这些分开什么?我在片段中使用它。

@Override
public void onBindViewHolder(@NonNull BettingViewHolder holder, int position) {
    BettingItem item = items.get(position);
    holder.homeTextView.setText(item.homeTeam);
    holder.awayTextView.setText(item.awayTeam);
    holder.dateTextView.setText(item.date);
    holder.leagueTextView.setText(item.league);
    holder.sportsTextView.setText(item.sport);
    holder.homeOddsTextView.setText(Double.toString(item.homeOdds));
    holder.drawOddsTextView.setText(Double.toString(item.drawOdds));
    holder.awayOddsTextView.setText(Double.toString(item.awayOdds));

    switch (item.outcome) {
        case HOME:
            holder.homeCheckBox.setChecked(true);
            break;

        case DRAW:
            holder.drawCheckBox.setChecked(true);
            break;

        case AWAY:
            holder.awayCheckBox.setChecked(true);
            break;

        default:
            holder.homeCheckBox.setChecked(false);
            holder.drawCheckBox.setChecked(false);
            holder.awayCheckBox.setChecked(false);
            break;
    }

    holder.item = item;
}




//its a part from ViewHolder's constructor
homeCheckBox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
    if (item != null) {
        homeCheckBox.setChecked(isChecked);
        if (isChecked) {
            item.outcome = BettingItem.Outcome.valueOf("HOME");
            drawCheckBox.setChecked(false);
            awayCheckBox.setChecked(false);
        } else {
            if (item.outcome == BettingItem.Outcome.valueOf("HOME"))
                item.outcome = BettingItem.Outcome.valueOf("NONE");
        }

        listener.onEventSelected(item);
    }
}
});

drawCheckBox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
    if (item != null) {
        drawCheckBox.setChecked(isChecked);

        if (isChecked) {
            item.outcome = BettingItem.Outcome.valueOf("DRAW");
            homeCheckBox.setChecked(false);
            awayCheckBox.setChecked(false);
        } else {
            if (item.outcome == BettingItem.Outcome.valueOf("DRAW"))
                item.outcome = BettingItem.Outcome.valueOf("NONE");
        }
        listener.onEventSelected(item);
    }
}
});

awayCheckBox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
    if (item != null) {
        awayCheckBox.setChecked(isChecked);
        if (isChecked) {
            item.outcome = BettingItem.Outcome.valueOf("AWAY");
            drawCheckBox.setChecked(false);
            homeCheckBox.setChecked(false);
        } else {
            if (item.outcome == BettingItem.Outcome.valueOf("AWAY"))
                item.outcome = BettingItem.Outcome.valueOf("NONE");
        }

        listener.onEventSelected(item);
    }
}
});

标签: javaandroidandroid-recyclerview

解决方案


您需要取消选中旧的复选框,因为 viewHolders 被回收(如果旧的复选框被选中,它将保持选中状态)。

switch (item.outcome) {
    case HOME:
        holder.homeCheckBox.setChecked(true);
        holder.drawCheckBox.setChecked(false);
        holder.awayCheckBox.setChecked(false);
        break;

    case DRAW:
        holder.homeCheckBox.setChecked(false);
        holder.drawCheckBox.setChecked(true);
        holder.awayCheckBox.setChecked(false);
        break;

    case AWAY:
        holder.homeCheckBox.setChecked(false);
        holder.drawCheckBox.setChecked(false);
        holder.awayCheckBox.setChecked(true);
        break;

    default:
        holder.homeCheckBox.setChecked(false);
        holder.drawCheckBox.setChecked(false);
        holder.awayCheckBox.setChecked(false);
        break;
}

如果用户点击它,我只会想要这种行为。我还不知道如何分开这些。

在这种情况下,请在您的 onCheckedChangedListener 中执行类似的操作

homeCheckBox.setOnCheckedChangedListener(buttonView, isChecked -> {
    if(buttonView.isPressed()){
       //user pressed the button. (handle user clicks)
    } else {
       //the program toggled the checkbox (do nothing)
    }
});

推荐阅读