单选可检查卡查看

时间:2019-05-20 03:14:28

标签: android android-cardview

我通过遵循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);
        }
    }

3 个答案:

答案 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();
  }
});

enter image description here enter image description here

答案 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”

XML文件

<com.google.android.material.card.MaterialCardView
        android:id="@+id/cardONE"
        <!-- THIS IS NEEDED -->
        android:checkable="true"
        android:clickable="true"
        android:focusable="true" />