9

RecyclerViewonClickListenerを設定する方法はありますか?RecyclerViewをクリックする方法(子供ではない)

私はRecyclerViewに子供がいて、OnClickListenerを親のRecyclerViewに設定しています。ただし、そのビューをクリックするとonClickは起動しません。以下のサンプルコードを参照してください - 親にクリックを得たい、NOT子供たち。このシナリオでは、アイテムのクリックには気にしません。

私は役に立たない子供にsetFocusable(false)setClickable(false)、およびsetOnClickListener(null)をやってみました。いずれにしても、子どもがいない地域をクリックすると、クリックも登録されないため、子どもが親からクリックを奪っているとは思われません。

package com.formagrid.hellotest; 

import android.app.Activity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import java.util.Arrays; 
import java.util.List; 

public class HelloActivity extends Activity { 

    private RecyclerView mRecyclerView; 
    private RecyclerAdapter mAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_hello); 

     mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     mAdapter = new RecyclerAdapter(Arrays.asList("hi", "this", "is", "some", "text")); 
     mRecyclerView.setAdapter(mAdapter); 
     mRecyclerView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Log.d("patricia", view.toString()); 
      } 
     }); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
    } 

    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.Holder> { 

     public class Holder extends RecyclerView.ViewHolder { 

      protected TextView textView; 

      public Holder(TextView itemView) { 
       super(itemView); 
       this.textView = itemView; 
      } 

     } 

     private List<String> contents; 

     public RecyclerAdapter(List<String> contents) { 
      this.contents = contents; 
     } 

     @Override 
     public Holder onCreateViewHolder(ViewGroup parent, int viewType) { 
      return new Holder(new TextView(parent.getContext())); 
     } 

     @Override 
     public void onBindViewHolder(Holder holder, int position) { 
      holder.textView.setText(contents.get(position)); 
     } 

     @Override 
     public int getItemCount() { 
      return contents.size(); 
     } 

    } 

} 

答えて

2

RecyclerViewonClickListenerを設定する方法はありますか?ある

いいえ、あなたはOnClickListener設定することができますが、RecyclerViewはそれを呼び出すことはありません。 RecyclerViewはすべてのタッチイベントを傍受しますが、performClick()を呼び出すことはありません。これはViewがリスナーを呼び出す方法です。

OnTouchListenerGestureDetectorOnClickListenerをシミュレートできます。 GestureDetectorのリスナーの場合、SimpleOnGestureListenerを使用し、onSingleTapUp()メソッドを実装することができます。

class ClickListener extends GestureDetector.SimpleOnGestureListener { 
    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     Toast.makeText(HelloActivity.this, "Clicked", 0).show(); 
     return true; 
    } 
}; 

はその後、我々はちょうどなど、OnTouchListenerからGestureDetectorMotionEvent Sを供給し、ドラッグ、スクロールを妨げないように、イベントを消費するかどうかを決定するためにリターンをチェックする必要があり

final GestureDetector detector = new GestureDetector(HelloActivity.this, new ClickListener()); 

mRecyclerView.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if(detector.onTouchEvent(event)) { 
       return true; 
      } 
      return false; 
     } 
    } 
); 

は、上記の溶液は、質問に記載されており、与えられたものと同様、ほとんど唯一の「シンプル」RecyclerViewで動作することに注意してください。ドラッグアンドドロップやスワイプのような、より複雑なアイテム処理を使用している場合は、タッチイベントチェーンを少し上にしてジェスチャー検出を処理する必要があります。

RecyclerViewをサブクラス化し、dispatchTouchEvent()メソッドで検出を実行することができます。タップが1つ検出された場合は、performClick()に電話すると、RecyclerViewOnClickListenerが発生します。

public class ClickableRecyclerView extends RecyclerView { 

    private final GestureDetectorCompat detector; 

    public ClickableRecyclerView(Context context) { 
     this(context, null); 
    } 

    public ClickableRecyclerView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     detector = new GestureDetectorCompat(context, new ClickListener()); 
    } 

    private class ClickListener extends GestureDetector.SimpleOnGestureListener { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      performClick(); 
      return true; 
     } 
    }; 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent e) { 
     detector.onTouchEvent(e); 
     return super.dispatchTouchEvent(e); 
    } 
} 

ちょうどあなたの通常のRecyclerViewの代わりに、このサブクラスを使用し、通常どおりにそれにOnClickListenerを設定します。これをインスタンス化する方法に応じて、追加のコンストラクタが必要な場合があります。

+1

私たちのために毛むくじゃらする可能性があります。 'RecyclerView'が' performClick'を呼び出さない理由を知っていますか? –

+1

さて、デザイナーには明確な答えを尋ねる必要がありますが、それは決してそのように使われることを意図したものではないからです。通常、ユーザーにリストを提示するときは、個々のアイテムの相互作用にもっと関心があります。どのようにあなたのために毛むくじゃらされますか?あなたが余分なコードを心配しているなら、あなたの 'Activity'のコードを汚染しないように、' RecyclerView'サブクラスにこれを実装することができます。既にジェスチャーを使用しているという場合は、この機能を既存のものに追加するだけで済みます。 –

+1

'OnClickListener'を使って死んでしまった場合、' RecyclerView'をサブクラス化して 'performClick()'を自分で呼び出すことができますが、単純なクリックとの区別のためにタッチイベントを追跡する必要があります。それは基本的にすべての 'GestureDetector'がやっていることです。 –

1

relativelayoutかのLinearLayoutかでframeLayoutの内側にあなたのrecyclerviewを包み込むような何かを試してみて、その後relativelayout /のLinearLayout /でframeLayoutにクリックリスナを設定します。

<RelativeLayout 
    android:id="@+id/myLayout" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
    </android.support.v7.widget.RecyclerView> 
</RelativeLayout> 

今:

RelativeLayout rl = (RelativeLayout) findViewById(R.id.myLayout); 
rl.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     Log.d("patricia", view.toString()); 
    } 
}); 
+1

これは私のためには機能しません。 –

-1

RecycleViewのクリックイベントですか?次のように試してみてください:

//set android:descendantFocusability="blocksDescendants" on parent layout 
//then setOnClickListener 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
**android:descendantFocusability="blocksDescendants"** 
android:layout_height="match_parent"> 

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</android.support.v7.widget.RecyclerView> 

</LinearLayout> 
+1

これは私のためには機能しません。それはあなたのために働くのですか? –

関連する問題