如何从API库修改/改编方法?

时间:2015-07-27 05:41:55

标签: java android android-recyclerview multipleselection statelistdrawable

我正在使用Big Nerd Ranch's 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背景的任何来源。我发现的是a commented section in this class总结的。内容如下:

  

selectionModeBackgroundDrawable默认为StateListDrawable,当state_activated = true时显示colorAccent主题颜色,否则不显示。

SwappingHolder类中,您可以看到返回导致错误的StateListDrawable的位置。此外,如果按照错误中的建议查看CardViewEclairMr1.java,您可以看到最直接导致错误的方法:

private RoundRectDrawableWithShadow getShadowBackground(CardViewDelegate cardView) {
        return ((RoundRectDrawableWithShadow) cardView.getBackground());
    }

老实说,在BigNerdRanch library中窥探之后,我仍然不知道该怎么办!我想我可能需要@Override引入StateListDrawable的BigNerdRanch方法,但是这会让我的手变得如此肮脏,它会破坏实现API的目的。 。如何解决此错误?

1 个答案:

答案 0 :(得分:1)

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

SwappingHolder通过交换顶级视图的drawable来工作。 CardView使用自己的drawable,因此如果您将它用作顶级视图,它将无法工作 所以正确的方法是这个 <FrameLayout ... > <CardView ... > </CardView> </FrameLayout>
或者您可以自己实施SelectableHolder界面,并选择显示所选项目的方式 所有这些都是作者单词所以这里是[链接到GitHub] [链接]到实际页面
[链接]:https://github.com/bignerdranch/recyclerview-multiselect/issues/14 祝好运 !