将RippleDrawable和StateListDrawable的效果添加到RecyclerView

Rya*_*rel 5 android rippledrawable android-5.0-lollipop android-recyclerview

我正在开发一个在大型设备上使用双窗格布局的应用程序,类似于此处详述的内容.布局摘要; 一个窗格包含选项列表,而另一个窗格显示从另一个窗格中选择的选项的详细信息.

现在,当选择一个选项时,会出现选择其他元素(按钮,复选框等)时出现的涟漪效应,但在动画完成后,元素将返回到之前的颜色.我想在动画完成后保留涟漪的亮点,我无法弄清楚如何实现这一目标.

这就是我的涟漪背景目前的样子.该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>
Run Code Online (Sandbox Code Playgroud)

为了重新迭代,我的问题是:是否有可能同时产生连锁效果,然后是突出显示的选择,如果是这样,怎么样?

And*_*rry 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>
Run Code Online (Sandbox Code Playgroud)

在您的适配器上,调用setHasStableIds(true)并实现getItemId以返回表示您的行的唯一值。

当选择一个项目时,执行以下操作:

ViewHolder oldViewHolder = (ViewHolder) recyclerView.findViewHolderForItemId(oldItemId);
oldViewHolder.itemView.setSelected(false);

ViewHolder newViewHolder = (ViewHolder) recyclerView.findViewHolderForItemId(newItemId);
newViewHolder.itemView.setSelected(true);
Run Code Online (Sandbox Code Playgroud)

同样在您的适配器中:

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

    ...

    viewHolder.itemView.setSelected(isSelected);

    ...
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,聚焦选择器用于突出显示使用方向键的设备(如电视和一些旧手机)上的导航。