我通过遵循https://medium.com/@AlbinPoignot/checkable-cardview-in-all-android-versions-7124ca6df1ab
实现了可检查的CardView但是,我需要让用户仅选择一个选项。 为了澄清,如果已经选中了一个,并且用户选择了另一个,则需要取消选择上一个选项。
此外,我还需要在返回选定的CardView时保持选中状态。
有人可以帮我完成这两个任务吗?下面是我的实现:
public class CheckableCardView extends CardView implements Checkable {
private static final int[] CHECKED_STATE_SET = {
android.R.attr.state_checked
};
private boolean isChecked;
private TextView itemText;
public CheckableCardView(Context context) {
super(context);
init(null);
}
public CheckableCardView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
public CheckableCardView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}
private void init(AttributeSet attrs) {
LayoutInflater.from(getContext()).inflate(R.layout.checkable_card_view, this, true);
setClickable(true);
setChecked(false);
setCardBackgroundColor(ContextCompat.getColorStateList(getContext(), R.color.selector_card_view_background));
if (attrs != null) {
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.CheckableCardView, 0, 0);
try {
String text = ta.getString(R.styleable.CheckableCardView_card_text);
itemText = (TextView) findViewById(R.id.text);
if (text != null) {
setText(text);
}
} finally {
ta.recycle();
}
}
}
public void setText(String text){
itemText.setText(text);
}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
@Override
public boolean performClick() {
toggle();
return super.performClick();
}
@Override
public void setChecked(boolean checked) {
this.isChecked = checked;
}
@Override
public boolean isChecked() {
return isChecked;
}
@Override
public void toggle() {
setChecked(!this.isChecked);
}
}
答案 0 :(得分:0)
您还可以使用MaterialCard
提供的Material Components Library。
此卡默认情况下实现Checkable
接口。
只需在xml中使用 android:checkable
属性:
<com.google.android.material.card.MaterialCardView
android:checkable="true"
..>
或代码中的setCheckable(true)
。
切换到已检查状态的方法是:
final MaterialCardView cardView = findViewById(R.id.card);
cardView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
//cardView.setChecked(!cardView.isChecked());
cardView.toggle();
}
});
答案 1 :(得分:0)
您可以通过声明来做到这一点:
private List<CheckableCardView> checkableCardViewList = new ArrayList<>();
然后您可以将卡片添加到“ onBindViewHolder”中的列表中
checkableCardViewList.add(position,holder.cardView);
最后,您可以添加一个回调函数,例如“ onClick”
holder.cardView.setOnClickListener(new CheckableCardView.OnClickListener() {
@Override
public void onClick(boolean b) {
if (b) {
for(CheckableCardView checkableCardView : checkableCardViewList) {
checkableCardView.setChecked(false);
}
checkableCardViewList.get(position).setChecked(true);
notifyDataSetChanged();
}
}
});
要进行回叫,您可以将其添加到底部的CheckableCardView中
public void setOnClickListener(OnClickListener onClickListener) { this.onClickListener = onClickListener;}
public interface OnClickListener {
void onClick(boolean b);
}
和顶部
private OnClickListener onClickListener;
@Override
public boolean performClick() {
toggle();
onClickListener.onClick(this.isChecked);
return super.performClick();
}
答案 2 :(得分:0)
对于那些正在寻找解决此问题的简单方法的人,下面是代码:
cardONE.setOnClickListener {
cardONE.isChecked = true // set the current card to checked
cardTWO.isChecked = false // set the other card to unchecked
}
cardTWO.setOnClickListener {
cardTWO.isChecked = true
cardONE.isChecked = false
}
或函数:
fun setChecked(checkCard: MaterialCardView, uncheckCard: MaterialCardView){
checkCard.isChecked = true
uncheckCard.isChecked = false
}
cardONE.setOnClickListener {
setChecked(it as MaterialCardView, cardTWO)
}
这可能不是最“优雅”的方式,但它就像一种魅力。
实现“ com.google.android.material:material:1.2.0”
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardONE"
<!-- THIS IS NEEDED -->
android:checkable="true"
android:clickable="true"
android:focusable="true" />