按下的选择器状态似乎不起作用

时间:2018-04-02 14:06:51

标签: android android-layout android-recyclerview android-imageview android-viewholder

我有一个带有ImageView的RecyclerView,因为它是ViewHolder。我想在我点击的ImageView周围添加一个白色边框。由于所有这些状态都非常令人困惑(压力,选择,专注),所有这些都可能意味着同样的事情,我想问一下这个具体案例。

这是适配器的ViewHolder xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_margin="10dp"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<com.myproject.RoundRectCornerImageView
    android:id="@+id/imageHolder"
    android:layout_width="56dp"
    android:layout_height="56dp"
    android:background="@drawable/image_details_selector"
    android:clickable="true"
    android:scaleType="centerCrop"
    android:src="@drawable/thumbnail"
    android:focusable="true" />

这是我正在使用的选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:state_selected="true">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="4dp" android:color="#fff" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>
</item>

<item android:state_pressed="false" android:state_selected="false">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="1dp" android:color="@android:color/transparent" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>

</item>

所以我想在这里做的是,在水平的RecyclerView中有一个图像列表,如果我点击其中一个图像,它将围绕自身获得这个白色边框,所有其他ImageViews都不会。我实现了onClick监听器,它在后台加载图像并且它正在工作,但我不能让这个选择器像我想的那样工作。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

首先,你必须像这样设置选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="4dp" android:color="#fff" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>
</item>

<item android:state_selected="false">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="1dp" android:color="@android:color/transparent" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>

</item>

在这种情况下,只有选中才有效。然后,您必须在适配器的getView()方法中手动设置选择,如下所示:

ImageView iv = (ImageView) findViewById(R.id.image_view);
    iv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(lastImageView != null)
                lastImageView.setSelected(false);
            lastImageView = (ImageView) view;
            lastImageView.setSelected(true);
        }
    });

并在适配器上将其设置为Global

private ImageView lastImageView = null;

答案 1 :(得分:0)

您在该方案中添加了android:state_selected="true",它正在检查条件按下效果和状态。从选择器中删除状态。希望这对你有用。

使用下面的选择器

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="4dp" android:color="#fff" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>
</item>

<item android:state_pressed="false">
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
        <stroke android:width="1dp" android:color="@android:color/transparent" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>

</item>

答案 2 :(得分:0)

请参阅此代码:

    '<?xml version="1.0" encoding="utf-8"?>
      <selector xmlns:android="http://schemas.android.com/apk/res/android">
       <item android:state_pressed="true">
         <shape android:shape="rectangle">
           <stroke android:width="4dp" android:color="#fff" />
           <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>
</item>

<item>
    <shape android:shape="rectangle">
        <stroke android:width="1dp" android:color="@android:color/transparent" />
        <padding android:bottom="1dp" android:left="1dp" android:right="1dp" android:top="1dp" />
    </shape>

</item>

请检查您在上面的代码中所做的事情与此相比。

答案 3 :(得分:0)

一旦检测到点击,您必须手动设置ImageView的状态。 RecyclerView不会为其子女存储状态。