2

RecyclerView에서 리플 효과를 구현하려고했습니다. 여기 내 레이아웃입니다 :가벼운 탭에서 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> 

기본적으로 내가 여기에이 튜토리얼 다음에 온 클릭 리스너 구현하려면 : http://sapandiwakar.in/recycler-view-item-click-handler/

문제가를 그 파급 효과, 라인에 생성 된 감사 :

android:clickable="true" 
android:focusable="true" 
android:foreground="?android:attr/selectableItemBackground" 

은 가벼운 (즉 빠른 것) 프레스에서 작동하지 않습니다. 화면을 빠르게 탭하면 클릭 리스너가 트리거됩니다. 터치 이벤트가 감지되었지만 파급 효과가 나타나지 않았 음을 의미합니다. 잔물결 효과를보고 싶다면 공개하기 전에 화면의 압력을 조금 더 오래 유지해야합니다.

이 동작을 수정하고 빠른 누르기에도 리플 효과를 표시하는 방법이 있습니까?

+0

'selectableItemBackgroundBorderless'를 사용하십시오. Marshmallow는'selectableItemBackground'의 동작을 변경하여 더 긴 탭에 대해서만 리플을 보여줄 것이라고 생각합니다. –

답변

2

비슷한 문제가 발생했습니다. 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

이는 항목 클릭 수신기에 addOnItemTouchListener를 사용했기 때문에 발생합니다. 그냥 인터페이스

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(); 
} 
})); 

을 만들 어댑터에서

RecyclerAdapter

에서 인터페이스를 생성하고 마법처럼 작동합니다.

recyclerView.addOnItemTouchListener( new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { // TODO Handle item click } }) );

관련 문제