我试图在我的RecyclerView上实现涟漪效果。这是我的布局:
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card"
android:layout_marginTop="7dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="5dp"
android:clickable="true"
card_view:cardElevation="5dp"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
//some properties />
<TextView
//some properties />
<TextView
//some properties />
</LinearLayout>
</android.support.v7.widget.CardView>
为了实现onclick监听器,我基本上遵循了本教程:http://sapandiwakar.in/recycler-view-item-click-handler/
问题是由于线条产生的涟漪效应:
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
没有处理灯光(也就是说快速)按下。当我快速点击屏幕时,会触发点击监听器。这意味着已检测到触摸事件,但没有显示波纹效果。如果我想看到涟漪效应,我必须在释放之前保持更长的屏幕压力。
有没有办法纠正这种行为,即使快速按下也会显示涟漪效应?
答案 0 :(得分:4)
我遇到了类似的问题。我在RecyclerView上有一个ItemClickListener,在那个监听器中我推了一个新片段。通过反复试验,我注意到删除或清空项目点击监听器每次都会显示突出显示,即使在轻敲时也是如此。
修复方法是更改我的onItemClick方法:
@Override
public void onItemClick(final RecyclerView parent, final View view, final int position, final long id)
{
ViewCompat.postOnAnimationDelayed(parent, new Runnable()
{
@Override
public void run()
{
// Your click code goes here
}
}, 50);
}
这会将您的点击操作推迟到下一个动画步骤后50ms,并为动画提供足够的时间来加载并运行您的点击操作。
答案 1 :(得分:1)
这是因为您已将addOnItemTouchListener用于项目单击侦听器。只需在RecyclerAdapter中创建一个界面
在适配器中创建一个接口
public interface OnItemClickListener {
void onItemClick(Item item);
}
private final List<ContentItem> items;
private final OnItemClickListener listener;
public Adapter(List<ContentItem> items, OnItemClickListener listener)
{
this.items = items;
this.listener = listener;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(items.get(position), listener);
}
//In your Activity
recycler.setAdapter(new Adapter(items, new
Adapter.OnItemClickListener() {
@Override public void onItemClick(ContentItem item) {
Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show();
}
}));
而不是代码,它将像魅力一样工作。
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) {
// TODO Handle item click
}
})
);
答案 2 :(得分:0)
很久以前问过,但认为这可能对某人有帮助,所以我遇到了类似的问题,并使用了postDelayed方法。
( new Handler()).postDelayed(new Runnable() {
@Override
public void run() {
//your code
}
}, 100);