点击时,RecyclerView项目不会更改背景颜色

时间:2017-12-16 17:04:15

标签: android android-recyclerview

点击某个项目后,与reyclerview相关的数据会有一些变化,所以我需要notifyDataSetChange()如下:

rv.addOnItemTouchListener(new RecyclerTouchListener(this, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position, MotionEvent e) {
                //modify data
                adapter.notifyDataSetChanged();

            }
}));

如果没有notifyDataSetChanged(),则点按时会更改背景颜色项目。但是,它不适用于notifyDataSetChanged()

这是项目背景:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/red" android:state_pressed="true"/>
</selector>

如果在onClick项目方法中使用notifyDataSetChanged()我的手指按住屏幕,我该如何更改项目背景颜色?

最后,我找到了解决方案。只需将onSingleTapUp中的返回值设置为false,这样事件将继续触发到我的项目的根视图。

    public RecyclerTouchListener(Context context, final ClickListener clickListener) {
        this.clickListener = clickListener;
        gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
//                return true;
                return false;
            }
        });
    }

3 个答案:

答案 0 :(得分:1)

您可以在notifyDataSetChanged之后以编程方式设置按下状态,然后您的视图应再次显示其state_pressed颜色背景:

view.setPressed(boolean)

答案 1 :(得分:1)

你即将成功。 正确的做法是制作像

这样的抽象画
  

click_effect_background.xml

<?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">
            <solid android:color="@color/colorLightGray" />
        </shape>
    </item>

    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/colorWhite" />
        </shape>
    </item>
</selector>

将其设置为行项目父级布局。就像你有LinearLayout作为行项的父项一样。 然后使用

android:background="@drawable/click_effect_background"

还在ViewHolder类中添加空白单击侦听器。

 view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });

您无需在代码中执行所有点击操作。

答案 2 :(得分:0)

您可以使用以下背景。由于代码将在渲染时从上到下执行,如果您按下或聚焦视图,它将设置相应的颜色。如果没有,那么它将设置正常颜色,如上一步所述。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/colorAccent" android:state_pressed="true" />
    <item android:drawable="@color/colorAccent" android:state_focused="true" />
    <item android:drawable="@color/colorPrimaryDark" />
</selector>