我正在使用Big Nerd Ranch的recyclerview-multiselect库来为我的RecyclerView
的CardViews
提供多选择功能。我已经解决了大多数应用程序的特定问题,但我遇到了一个相当大的问题。每当RecyclerView
在SelectionMode
和必须重新创建卡(这通常,因为这实际上是RecyclerView
的点,至少如果我理解正确,)它抛出这个错误:
java.lang.ClassCastException: android.graphics.drawable.StateListDrawable cannot be cast to android.support.v7.widget.RoundRectDrawableWithShadow
at android.support.v7.widget.CardViewEclairMr1.getShadowBackground(CardViewEclairMr1.java:159)
at android.support.v7.widget.CardViewEclairMr1.getMinWidth(CardViewEclairMr1.java:150)
at android.support.v7.widget.CardView.onMeasure(CardView.java:181)
at android.view.View.measure(View.java:16498)
逻辑上,我遵循错误的任何来源导致StateListDrawable被设置为CardView
的背景。这个类 中的注释部分总结了我的发现。它的内容如下:
selectionModeBackgroundDrawable默认为StateListDrawable,当state_activated=true时显示colorAccent主题颜色,否则不显示。
在SwappingHolder
类中,您可以看到在何处返回导致错误的StateListDrawable
。此外,如果您查看CardViewEclairMr1.java
,就像错误中建议的那样,您可以看到最直接导致错误的方法:
private RoundRectDrawableWithShadow getShadowBackground(CardViewDelegate cardView) {
return ((RoundRectDrawableWithShadow) cardView.getBackground());
}
老实说,在bignerdrach库中窥探了这么多之后,我仍然不知道该怎么做!我想我可能需要@Override
的bignerdrach方法带来了一个StateListDrawable
,但这会让我的手太脏的库,它会打败实现他们的API的目的开始。如何修复此错误?
给出答案有点晚了,但我发现了一些对我有用的东西。检查你的CardView布局是否被包装在ViewGroup中,如果不是,那可能是问题所在。
SwappingHolder通过交换顶层视图的可绘制对象来工作。CardView使用自己的drawables,所以如果你用它作为顶层视图,它将无法工作。
正确的方式是这个<FrameLayout
...
>
<CardView
...
>
</CardView>
</FrameLayout>
或者您可以自己实现SelectableHolder接口,并选择如何显示所选项目。
这些都是作者的文字所以这里有一个[链接到GitHub][链接]到实际页面
(链接):https://github.com/bignerdranch/recyclerview-multiselect/issues/14。>