2

我正在使用Big Nerd Ranch 的 recyclerview-multiselect库来提供我RecyclerViewCardViews多选功能。我已经解决了大部分应用程序特定的问题,但我遇到了一个相当大的问题。每当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());
    }

老实说,在BigNerdRanch 库中窥探了这么多之后,我仍然不知道该怎么办!我在想我可能需要引入@Override一个StateListDrawable. 如何修复此错误?

4

1 回答 1

1

答案有点晚了,但这是我发现并且对我有用的东西。检查您的 CardView 布局是否包含在 ViewGroup 中,如果不是,则可能是问题所在。

SwappingHolder 通过交换顶层视图的可绘制对象来工作。CardView 使用自己的可绘制对象,因此如果将其用作顶级视图,它将无法工作。
所以正确的做法是这样
<FrameLayout ... > <CardView ... > </CardView> </FrameLayout>
或者你可以自己实现SelectableHolder接口,选择你想如何显示一个选中的item。
所有这些都是作者的话,所以这里有一个 [链接到 GitHub][链接] 到实际页面
[链接]:https ://github.com/bignerdranch/recyclerview-multiselect/issues/14 。
祝你好运 !

于 2015-08-23T18:51:07.570 回答