将RippleDrawable和StateListDrawable效果添加到RecyclerView

5
我正在开发一款应用程序,该应用在大屏设备上使用双面板布局,类似于这里所详细介绍的内容。布局概述:一个面板包含选项列表,而另一个面板将显示从其他面板中选择的选项的详细信息。
目前,在选择选项时,会看到类似于选择其他元素(按钮、复选框等)时看到的涟漪效果,但是动画完成后,元素会返回其先前的颜色。我希望在动画完成后保留来自涟漪的高亮显示,并且我无法弄清如何实现这一点。
这是我的涟漪背景目前的样子。 focus 选择器无效 - 找不出如何实际给元素焦点。 我还尝试使用 selected 选择器,但那会立即发生,覆盖了涟漪效果。
<?xml version="1.0" encoding="utf-8"?>
    <ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorAccent">
    <item android:id="@android:id/mask"
        android:drawable="@android:color/black" />
    <item>
        <selector>
            <item android:state_focused="true"
                android:drawable="@color/accent" />
        </selector>
    </item>
</ripple>

再次强调,我的问题是:在点击时同时出现波纹效果和高亮选择效果,是否可能?如果可能,应该如何实现?

一个糟糕的解决方案(我尝试过,可行的方法)是将您的项目背景设置为带有默认水波纹项(不带其选择器)和“选中”状态的“selector”,然后在点击后使用postDelayed 将您的视图状态设置为已选中(您需要实现Checkable)。尝试一些不那么hacky的方法 - 由于RippleDrawable只是一个LayerDrawable,因此尝试覆盖onStateChange以检测按下状态,然后手动更改“content”图层的背景,以便在动画完成时看到所选颜色。 - ahmedre
2个回答

1
这使得我在选择时保留了涟漪动画。
使用您的涟漪可绘制项:
<?xml version="1.0" encoding="utf-8"?>
    <item>
        <selector>
            <item android:state_selected="true"
                  android:drawable="@color/selected_color" />
            <item android:drawable="@color/normal_color" />
        </selector>
    </item>
</ripple>

在您的适配器中调用setHasStableIds(true)并实现getItemId以返回表示行的唯一值。
当选择一个项目时,请执行以下操作:
ViewHolder oldViewHolder = (ViewHolder) recyclerView.findViewHolderForItemId(oldItemId);
oldViewHolder.itemView.setSelected(false);

ViewHolder newViewHolder = (ViewHolder) recyclerView.findViewHolderForItemId(newItemId);
newViewHolder.itemView.setSelected(true);

在你的适配器中:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {

    ...

    viewHolder.itemView.setSelected(isSelected);

    ...
}

顺便提一下,聚焦选择器用于在使用类似电视和一些较老的手机的 d-pad 设备上突显导航。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接