2017-05-16 12 views
2

私はRecyclerViewにリップル効果を実装しようとしました。ここに私のレイアウトは、それのためだ:私は基本的にここにこのチュートリアルに従っonclickのリスナーを実現するために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 } }) );

関連する問題