0
recyclerview-multiselect是一個優秀的庫,用於管理多個選擇,並且在RecyclerView
中使用ActionMode
。在使用recyclerview-multiselect時丟失CardViews
但是,如果使用CardView
作爲項目,它會在正常狀態(未激活)中變爲不可見狀態。如果它被激活,則顯示很好 - 帶有重音顏色。
我們該如何解決這個問題?
recyclerview-multiselect是一個優秀的庫,用於管理多個選擇,並且在RecyclerView
中使用ActionMode
。在使用recyclerview-multiselect時丟失CardViews
但是,如果使用CardView
作爲項目,它會在正常狀態(未激活)中變爲不可見狀態。如果它被激活,則顯示很好 - 帶有重音顏色。
我們該如何解決這個問題?
這可能是因爲您在RecyclerViewAdapter
中正在使用SwappingHolder。此課程不會正確設置CardView
的背景顏色。
相反延伸MultiSelectorBindingHolder並覆蓋抽象方法,如以下:
class ViewHolder extends MultiSelectorBindingHolder implements View.OnClickListener,
View.OnLongClickListener {
final CardView cardView;
private ColorStateList defaultCardBackground;
private ColorStateList selectableCardBackground;
private StateListAnimator defaultStateListAnimator;
private StateListAnimator selectableStateListAnimator;
private boolean selectable;
ViewHolder(View view) {
super(view, multiSelector);
if (view instanceof CardView) {
Log.d(TAG, "ViewHolder: got the cardView");
cardView = (CardView) view;
} else {
throw new IllegalStateException("Expected a CardView!");
}
this.selectable = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
defaultStateListAnimator = itemView.getStateListAnimator();
selectableStateListAnimator = Utils.getRaiseStateListAnimator(context);
} else {
defaultStateListAnimator = null;
selectableStateListAnimator = null;
}
defaultCardBackground = cardView.getCardBackgroundColor();
selectableCardBackground = Utils.getSelectableCardBackground(context);
}
@Override
public void setSelectable(boolean selectable) {
boolean changed = (selectable != this.selectable);
if (changed) {
Log.d(TAG, "setSelectable: changed");
this.selectable = selectable;
refreshChrome();
}
}
private void refreshChrome() {
Log.d(TAG, "refreshChrome : selectable = " + selectable + ", title:" + download.getTitle());
ColorStateList cardBackgroundColor = this.selectable ?
this.selectableCardBackground :this.defaultCardBackground;
this.cardView.setCardBackgroundColor(cardBackgroundColor);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
StateListAnimator animator = this.isSelectable() ?
this.selectableStateListAnimator : this.defaultStateListAnimator;
this.cardView.setStateListAnimator(animator);
if(animator != null) {
animator.jumpToCurrentState();
}
}
}
@Override
public boolean isSelectable() {
return selectable;
}
@Override
public void setActivated(boolean b) {
cardView.setActivated(b);
}
@Override
public boolean isActivated() {
return cardView.isActivated();
}
}