点击某个项目后,与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;
}
});
}
答案 0 :(得分:1)
您可以在notifyDataSetChanged之后以编程方式设置按下状态,然后您的视图应再次显示其state_pressed颜色背景:
答案 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>