【问题标题】:RIpple effect on RecyclerView not working on light tapRecyclerView 上的波纹效果在轻按时不起作用
【发布时间】:2017-05-16 10:04:30
【问题描述】:

我尝试在我的 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"

不适用于轻型(即快速)印刷机。当我快速点击屏幕时,点击监听器被触发。这意味着已经检测到触摸事件,但是没有显示涟漪效应。要想看到涟漪效果,就得在屏幕上的压力再保持一段时间再松开。

有没有办法纠正这种行为,即使是快速按下也能显示连锁反应?

【问题讨论】:

  • 使用selectableItemBackgroundBorderless。我认为 Marshmallow 改变了 selectableItemBackground 的行为,所以它只在较长的点击时显示波纹。

标签: android android-recyclerview ripple recyclerview-layout


【解决方案1】:

我遇到了类似的问题。我在 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);
}

这会将您的点击操作推迟到下一个动画步骤之后的 50 毫秒,并在执行点击操作之前给动画足够的时间来加载和运行。

【讨论】:

    【解决方案2】:

    发生这种情况是因为您已将 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
          }
       })
    );
    

    【讨论】:

      【解决方案3】:

      很久以前问过但认为它可能对某人有帮助,我遇到了类似的问题并使用了 postDelayed 方法。

         ( new Handler()).postDelayed(new Runnable() {
              @Override
              public void run() {
                 //your code 
              }
          }, 100);
      

      【讨论】:

        猜你喜欢
        • 2018-03-15
        • 1970-01-01
        • 2015-11-03
        • 2021-10-21
        • 2015-04-22
        • 1970-01-01
        • 2021-09-30
        • 2016-05-24
        • 2022-01-23
        相关资源
        最近更新 更多