我有这个items.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:focusable="true"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="60dp"
android:id="@+id/colorPreview" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="@android:color/white"
android:id="@+id/colorName" />
</RelativeLayout>
当我单独使用它时,selectableItemBackground在我单击视图时动画。但是当我将它用于RecyclerView中的项目时,对点击的影响不再发生。我该如何解决这个问题?
PS:这是RecyclerView上的监听器,如果它是相关的:
public ColorListOnItemTouchListener(Context context, OnItemClickListener clickListener) {
mClickListener = clickListener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
if(childView != null && mClickListener != null) {
mClickListener.onItemLongPress(childView, index);
}
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if(childView != null && mClickListener != null) {
mClickListener.onItemClick(childView, index);
}
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
});
}
谢谢!
编辑:
public class ColorsCursorAdapter extends RecyclerView.Adapter<ColorsCursorAdapter.ViewHolder> {
private static final int layout = R.layout.color_item;
private Cursor mCursor;
public ColorsCursorAdapter(Cursor c) {
super();
this.mCursor = c;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
TextView name = (TextView) v.findViewById(R.id.colorName);
ImageView image = (ImageView) v.findViewById(R.id.colorPreview);
return new ViewHolder(v, name, image);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
mCursor.moveToPosition(position);
int color = mCursor.getInt(mCursor.getColumnIndex(ColorItem.COLUMN_COLOR));
holder.colorName.setText(Utils.getColorString(color));
holder.colorPreview.setImageDrawable(new ColorDrawable(color));
}
@Override
public int getItemCount() {
if(mCursor != null) {
return mCursor.getCount();
}
return 0;
}
public void swapCursor(Cursor c) {
mCursor = c;
notifyDataSetChanged();
}
public Cursor getCursor() {
return mCursor;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView colorName;
public ImageView colorPreview;
public ViewHolder(View root, TextView colorName, ImageView colorPreview) {
super(root);
root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
}
});
this.colorName = colorName;
this.colorPreview = colorPreview;
}
}
}
使用以下命令创建适配器:
colorList.setLayoutManager(new LinearLayoutManager(this));
adapter = new ColorsCursorAdapter(null);
colorList.setAdapter(adapter);
答案 0 :(得分:40)
其他答案中未提及的内容:设置if(preg_match("/^[А-Яа-яa-zA-Z0-9()-_«»%@#\s]+$/", $title) {
//success
} else {
//error
}
是必需的,以便在没有OnClickListener附加到视图时使动画生效。
答案 1 :(得分:15)
不是将其设置为背景,而是将其设置为前景,它可以正常工作。希望它会有所帮助。
android:foreground="?attr/selectableItemBackground"
答案 2 :(得分:8)
在items.xml中,将FrameLayout设置为根布局,并为FrameLayout设置selectableItemBackground。它对我有用,但我不知道为什么。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:foreground="?android:selectableItemBackground">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- your code -->
</RelativeLayout>
</FrameLayout>
答案 3 :(得分:1)
您想要具有波纹效果的视图必须是可单击的。您可以通过在XML文件中指定android:clickable =“ true”或通过编程设置onClickListener来实现。当您在RecyclerView中的项目上使用此功能并且使用Kotlin时,请从ViewHolder类的“ itemView”上设置onClickListener。
答案 4 :(得分:0)
我看到了同样的行为。在我这方面,这与以下事实有关:当我点击片段中的列表项并直接用另一个片段替换该片段时,动画没有时间显示。一旦我删除了片段替换,我就能看到动画。
答案 5 :(得分:0)
@Override
public boolean onSingleTapUp(MotionEvent e) {
if(childView != null && mClickListener != null) {
mClickListener.onItemClick(childView, index);
}
return true;
}
返回false可能会解决此问题。对我来说,我在按钮上覆盖onTouch并在最后返回true。返回false可以通过设置启用触摸动画:
android:background="?attr/selectableItemBackground"
答案 6 :(得分:0)
在我的情况下,问题是由DividerItemDecoration
引起的。一旦我摆脱它,它开始工作。我建议在xml
中为每个项目RecyclerView
文件末尾添加一行,它更容易定制,您不会遇到这些问题。< / p>
答案 7 :(得分:0)
以前的解决方案中没有一个对我有用。
最后,我必须为此实现自己的drawable,其工作类似于Android提供的工作。
res / drawable / selectable_item_background.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/colorAccent">
<item
android:id="@android:id/mask"
android:drawable="@android:color/white" />
</ripple>
就像您使用了Android drawable
android:background =“ @ drawable / selectable_item_background”
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selectable_item_background"
android:clickable="true"
android:orientation="vertical">
...
有关更多信息或API 21之前版本的实现,请查看this post。
答案 8 :(得分:-1)
它的编码效果很好
<LinearLayout
android:id="@+id/lly_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weightSum="3"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
android:orientation="horizontal"
android:layout_margin="10dp">
</LinearLayout>