Alguien tiene el uso de RecyclerView encontrado una manera de establecer un onClickListener a los elementos de la RecyclerView?
Pensé en la configuración de un detector para cada uno de los diseños para cada elemento, pero que parece un poco demasiado complicado
Estoy seguro de que hay un camino para la RecyclerView para escuchar la onClick evento, pero no acabo de entenderlo.

InformationsquelleAutor CurtJRees | 2014-06-28

43 Comentarios

  1. 443

    Como la API han cambiado radicalmente, no me sorprendería si fuera a crear un OnClickListener para cada elemento. No es que se mucho de una molestia, aunque. En la implementación de RecyclerView.Adapter<MyViewHolder>, usted debe tener:

    private final OnClickListener mOnClickListener = new MyOnClickListener();
    
    @Override
    public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
        view.setOnClickListener(mOnClickListener);
        return new MyViewHolder(view);
    }

    La onClick método:

    @Override
    public void onClick(final View view) {
        int itemPosition = mRecyclerView.getChildLayoutPosition(view);
        String item = mList.get(itemPosition);
        Toast.makeText(mContext, item, Toast.LENGTH_LONG).show();
    }
    • lo que si quiero eliminar una fila en su haga clic en ?
    • Me gusta esta respuesta mejor que la que se enlaza. El que quiera escribir un gesto de escucha y de golpe cuadro de detección de manejar esto. Google–
    • getChildPosition(ver) está en desuso método
    • podemos utilizar getChildLayoutPosition(ver) en su lugar.
    • getChildAdapterPosition(vista) es una opción más fiable que getChildLayoutPosition(ver) getChildLayoutPosition(ver) no puede ser igual a la del Elemento de posición del adaptador si hay cambios pendientes en el adaptador, el cual no se han reflejado en el diseño todavía.
    • ¿Te importaría decirle que las clases son tus fragmentos en? onClick(), pertenecientes a OnClickListener puede ser conectado a CUALQUIER punto de Vista. La cuestión aquí es que! Por favor, hagan un esfuerzo, un método no sólo se identifican por un nombre, sino también, al menos por una clase. Si no decir que su código es para ser agregado al adaptador, y su respuesta no ayuda.
    • Si el método onClick en el fragmento que contiene el RecyclerView ? Como referencia a la mRecyclerView en su MyOnClickListener clase. ¿De dónde sacaste la referencia a ese objeto ?
    • getChildPosition ahora es obsoleta, por favor vea mi respuesta a continuación y gist.github.com/RTimal/ddf4040cfba28b461ec7
    • +1 por el hecho de que, específicamente, señaló otro de los autores del método es menos estrechamente unida, y vinculado a ella como la primera línea de su respuesta.
    • getChildPosition(View) es obsoleto. Uso public int getChildAdapterPosition (View child) lugar. La documentación completa, aquí
    • getChildPosition es obsoleto getChildAdapterPosition le dar mal posición al desplazar la vista. getChildLayoutPosition le dar correcto posición.
    • Ninguna de las respuestas están trabajando para mí
    • Donde MyOnClickListener de la clase debe ser por escrito?
    • public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int position) es confuso. El segundo argumento es viewType en lugar de posición. El posición argumento sólo está disponible en onBindViewHolder(MyViewHolder holder, int position)
    • RecyclerView es bastante potente aunque tenga que hacer el trabajo de campo para manejar los datos y lidiar con los cambios. +1 para la respuesta, perfecto!
    • Cómo enviar mRecyclerView en un adaptador ?
    • es una mala práctica para implementar haga clic en oyente dentro de un onCreateView().
    • Haga clic en la unión de la escucha durante ViewHolder la creación es la forma correcta, ya que evita repetida escucha de las asignaciones que podría ocurrir si se hizo en onBindViewHolder. Sin embargo, el truco está perdido, es que yo también uso ViewHolder para retener un número de IDENTIFICACIÓN (o algún otro ‘mango’ metadatos) que proporciona los medios para determinar el hecho clic en el elemento. Esto es en lugar de todas las inútil saltar a través de aros para calcular clic posición del Elemento. Así que todo lo que hacer es enlazar un clic de escucha en el titular de la cto r, y tiene el titular de captura de metadatos de la información que proporciona un puntero de algún tipo a la base de datos.
    • Me parece absolutamente sorprendente que a pesar de ser tan sencillo de hacer como se describió anteriormente, algunos de los más votada respuestas aquí defensor del uso de MotionEvents y varios otros hinchazón.
    • ¿dónde esta ‘onClick’ método pertenece? ¿Cómo se consigue la ‘mRecyclerView’ dentro de ese método onClick?
    • ¿qué pasa si la lista tiene un elemento ? :/ necesito reciclador de vista de elemento, haga clic en haga clic en no
    • me pueden ayudar a resolver este stackoverflow.com/questions/50115252/…
    • ¿de dónde viene esta ‘onClick’ método pertenecen? ¿Cómo se consigue la ‘mRecyclerView’ dentro de ese método onClick?…
    • Herwade puede reemplazar el método onAttachedToRecyclerView() de su adaptador, entonces usted va a obtener una referencia a la recyclerView; definir una variable de miembro de decir mRecyclerView. Y ahora, ya lo tienes.
    • ¿por qué es tan confuso para simplemente añadir un listener =.=» es mucho más fácil en iOS… Añadiendo delegado
    • que mRecyclerView fue que me molesta (¿cómo se puede acceder a ella en el interior del adaptador de clase), así que he modificado el Adaptador constructor Adapter(..., RecyclerView rcv) a aceptar el dueño de la RV. Entonces soy capaz de acceder al elemento de la posición [dentro onClick] final int pos = myAdapter.this.myRecView.getChildAdapterPosition(view); y parece que funciona…
    • Hola compañero, me puedes ayudar a resolver este problema por favor.. me han pegado muchos días aquí stackoverflow.com/questions/57068321/…
    • No, y te agradecería que si no se ping gente como esta.

  2. 581

    Aquí es una mejor y menos estrechamente unida manera de implementar un OnClickListener para un RecyclerView.

    Fragmento de uso:

    RecyclerView recyclerView = findViewById(R.id.recycler);
    recyclerView.addOnItemTouchListener(
        new RecyclerItemClickListener(context, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
          @Override public void onItemClick(View view, int position) {
            //do whatever
          }
    
          @Override public void onLongItemClick(View view, int position) {
            //do whatever
          }
        })
    );

    RecyclerItemClickListener aplicación:

    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;
    public interface OnItemClickListener {
    public void onItemClick(View view, int position);
    public void onLongItemClick(View view, int position);
    }
    GestureDetector mGestureDetector;
    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
    return true;
    }
    @Override
    public void onLongPress(MotionEvent e) {
    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
    if (child != null && mListener != null) {
    mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
    }
    }
    });
    }
    @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
    mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
    return true;
    }
    return false;
    }
    @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { }
    @Override
    public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
    }
    • Esto no va a proporcionar alguna pista sobre qué botón o la vista (en el artículo) que se hizo clic. Pero para el conjunto de elemento, haga clic en, este está muy bien.
    • lo que si quiero eliminar una fila en su haga clic en ?
    • Usted no debe tener ningún problema de eliminar una fila en haga clic en. El OnItemClickListener le da la posición de la vista en el adaptador de modo que usted puede eliminar.
    • ngen comentario es correcto – si desea adjuntar un onClick oyente a un elemento concreto dentro de la vista de elemento, usted probablemente debería hacerlo en su adaptador, en onBindViewHolder, o en su viewholder sí mismo.
    • Un problema con este método es cuando estás haciendo algo que lleva unos pocos cientos de milisegundos como el inicio de una actividad. Cuando el elemento se hace clic, y tiene un clic de animación hay un retraso notable entre clic y ver la animación.
    • Por favor alguien puede explicar el papel de mGestureDetector.onTouchEvent(e) aquí y cómo ayuda en la determinación de la haga clic en?
    • Esta solución se siente muy torpe, hay un poco de demora en el procesamiento de los ‘clic’ y la sensación no es sólo aceptar
    • ¿Por qué es su código en OnInterceptTouchEvent en lugar de OnTouchEvent?
    • Lo siento, ¿cómo puedo utilizar la setItemChecked(position) con su aplicación?
    • podemos manejar haga clic en las opiniones de cada uno en el adaptador y el elemento, haga clic en el oyente. El tacto es interceptado por onTouchListener. Si tengo ambos, entonces he de incendio, uno de los oyentes en la vista y el otro en la fila del elemento
    • Nota: la vista.getChildPosition(childView) es obsoleto ahora
    • ¿cómo puedo implementar onLongPress en esto….
    • actualmente puedo añadir un método onLongPress(MotionEvent e) en la interfaz de & en el GestureDetector anular onLogpress. (@Override public void onLongPress(MotionEvent e) { oyente.onLongPress(e); }) quiero pasar el niño y la posición , no por el evento de movimiento para el oyente como onItemClick…. ¿Cómo puedo aplicar esto..
    • Podría alguien explicarme por qué esta solución con la GestureDetector se supone para ser una solución mejor que la utilización del «setOnClickListener» dentro de onBindViewHolder() en el adaptador de la función de elemento? De esta manera, al menos, necesito menos código que con el GestureDetector solución. Gracias por una explicación.
    • ¿Qué puedo usar en lugar de la vista.getChildPosition como se ha depreciado?
    • Simplemente utilizar interfaces para evitar la complejidad. Consulte gist.github.com/riyazMuhammad/1c7b1f9fa3065aa5a46f
    • Me acabo de enterar de que este enfoque plantea un grave problema de rendimiento. Hay un gran retraso antes de que el usuario puede desplazarse por la lista(teniendo en cuenta una lista de varios elementos). El usuario tiene que mantener por algún tiempo, antes de desplazamiento para que el RecyclerView para desplazarse, de lo contrario, es sólo responder a la dura eventos.
    • getChildPosition ahora es obsoleto y esto no digo que la vista se ha hecho clic. Por favor vea mi respuesta a continuación y gist.github.com/RTimal/ddf4040cfba28b461ec7
    • este método no se mostrará el efecto de clic en ese elemento. Por favor siga el enlace de abajo plus.google.com/+AnjulaSashika/posts/D9jtomxRyDr
    • Usted también debe reemplazar onRequestDisallowInterceptTouchEvent evento.
    • Por alguna razón que no devuelve un clic de vista. En mi caso hago clic en una casilla de verificación, pero dado que la vista es algo diferente. De la manera que yo compruebe: view.getId() == R.id.selection
    • Me di cuenta de que la vista es un superior Layout para un list_item.xml. ¿Cómo puedo saber en qué exactamente view un clic fue?
    • getChildPosition() método está en desuso. Uso getChildAdapterPosition(Vista) o getChildLayoutPosition(Ver).
    • ¿por qué este método es mejor que el de colocación de onClickListener en los Elementos individuales ??
    • Esta aplicación presenta un par de torpes casos de borde desde el toque eventos están divorciados desde el punto de vista que representan. Entre ellos, haga clic en calendario. GestureDetector apoya a largo pulse por defecto, por lo que una haga clic en más se consume y nunca informó de largo, la prensa debe estar apagado. Otra es la necesidad de establecer el punto de vista visual clickability por separado. Esta aplicación no se conecta con la habilitación de la vista para mostrar este estado para el usuario.
    • ¿Por qué está tomando un Context como un parámetro del constructor cuando se puede utilizar recyclerView.getContext()?
    • Otra razón para evitar el Gesto Detector de solución es que no funciona con el teclado de navegación.
    • Tengo una casilla de verificación en la tarjeta y cuando yo uso esta clase, por alguna razón titular.casilla de verificación.setOnCheckedChangeListener no se llama. Cómo ordenar de traer la casilla de verificación «al frente»?
    • Esta solución no considerar el enfoque de navegación (tecla de navegación), algo que con un simple clic oyente podría resolver (haga clic en los oyentes encapsula teclado entrar, D-Pad del centro, y otros eventos de puntero). Esta solución es no accesible, ya que sólo puede manejar eventos de toque y no debe ser utilizado. Considere el uso de un simple clic oyente con getChildAdapterPosition() para recuperar la posición.
    • Cuando el usuario haga clic sobre el botón que se encuentra dentro del punto de vista, cómo manejar ese evento?
    • no funciona en una lista con un solo elemento. su elemento, haga clic en lugar de recycler, haga clic en.

  3. 106

    Yo lo hago de esta manera, sin que haya clases, detectores, etc. Simple código dentro de nuestro adaptador. Sobre todo mejor solución para longClick que se presentan antes.

    public class PasswordAdapter extends RecyclerView.Adapter<PasswordAdapter.ViewHolder> {
    private static ClickListener clickListener;
    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
    TextView name;
    public ViewHolder(View itemView) {
    super(itemView);
    itemView.setOnClickListener(this);
    itemView.setOnLongClickListener(this);
    name = (TextView) itemView.findViewById(R.id.card_name);
    }
    @Override
    public void onClick(View v) {
    clickListener.onItemClick(getAdapterPosition(), v);
    }
    @Override
    public boolean onLongClick(View v) {
    clickListener.onItemLongClick(getAdapterPosition(), v);
    return false;
    }
    }
    public void setOnItemClickListener(ClickListener clickListener) {
    PasswordAdapter.clickListener = clickListener;
    }
    public interface ClickListener {
    void onItemClick(int position, View v);
    void onItemLongClick(int position, View v);
    }
    }

    A continuación, dentro de un fragmento o de la actividad, acaba de golpear:

    PasswordAdapter mAdapter = ...;
    mAdapter.setOnItemClickListener(new PasswordAdapter.ClickListener() {
    @Override
    public void onItemClick(int position, View v) {
    Log.d(TAG, "onItemClick position: " + position);
    }
    @Override
    public void onItemLongClick(int position, View v) {
    Log.d(TAG, "onItemLongClick pos = " + position);
    }
    });
    • en lugar de OurAdapter.clickListener creo Marurban significa PasswordAdapter.clickListener y en lugar de TrainingAdapter.ClickListener(), debe ser PasswordAdapter.ClickListener(). Aparte de eso, la gran solución Marurban! trabajó para mí
    • onItemClick escucha también está siendo activado en la larga haga clic en.
    • Tuve que usar v. setClickListener(este) en ViewHolder constructor para hacer que funcione. Pero longclicklistener sigue sin funcionar
    • ViewHolder debe de ser estático para el mejor rendimiento. esto no es una buena respuesta.
    • En el ViewHolder Clase, cuando me puse el onLongClick para devolver false, yo fuego fuera un longclick y ambos onItemClick y onItemLongClick llamado. Cuando me puse el onLongClick devolver true, sólo el clic correcto se llama, pero el adaptador no actualización de la recyclerview cuando puedo eliminar un elemento de una larga haga clic en. Todas las Ideas que a lo que estoy haciendo mal?
    • La estática clickListener crea una pérdida de memoria. Declarar el oyente no estático y se unen a la ViewHolder lugar.
    • return true de onLongClick para consumir el evento y evitar brindis que aparecen para ambos clic y clic largo.
    • Puede usted, hágamelo saber si tengo 2 botones ¿Cómo puedo llegar a saber que botón se hace clic dentro de la Recyclerview?
    • Usted puede comprobar su identificación dentro de método onClick v. getId()
    • ¿Puede dar un ejemplo de cómo la mejor manera de enlazar el clickListener a la ViewHolder? Simplemente asignar a la itemView de la clickListener?
    • La forma más sencilla es inicializar el oyente temprano y pasar como argumento para el Adaptador de constructor y, a continuación, el ViewHolder constructor.

  4. 95

    Retirar una similar pregunta @CommonsWare del comentario enlaces a este, que implementa el OnClickListener interfaz en la viewHolder.

    He aquí un ejemplo simple de la ViewHolder:

        TextView textView;//declare global with in adapter class
    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    private ViewHolder(View itemView) {
    super(itemView);
    itemView.setOnClickListener(this);
    textView = (TextView)view.findViewById(android.R.id.text1);
    }
    @Override
    public void onClick(View view) {
    Toast.makeText(view.getContext(), "position = " + getLayoutPosition(), Toast.LENGTH_SHORT).show();
    //go through each item if you have few items within recycler view
    if(getLayoutPosition()==0){
    //Do whatever you want here
    }else if(getLayoutPosition()==1){ 
    //Do whatever you want here         
    }else if(getLayoutPosition()==2){
    }else if(getLayoutPosition()==3){
    }else if(getLayoutPosition()==4){
    }else if(getLayoutPosition()==5){
    }
    //or you can use For loop if you have long list of items. Use its length or size of the list as 
    for(int i = 0; i<exampleList.size(); i++){
    }
    }
    }

    La Adapter, a continuación, se parece a esto:

        @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view =LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
    return new ViewHolder(view);
    }
    • Esto parece ir en la dirección equivocada, aunque. Si usted necesita volver a utilizar un recyclerview en otro fragmento/actividad, el adaptador/viewholder son ahora la definición de la lógica de los clics en lugar de lo que los contienen. Los clics que realmente debe ser manejado en forma directa o indirectamente, por el que contiene la instancia. Parece que un toque de escucha es la única manera efectiva de ir sobre esto.
    • No veo la manera de que ese es el problema. Si el ViewHolder en sí mismo contiene toda la información en cuanto a qué datos se selecciona cuando el elemento en sí se hace clic en, a continuación, la única responsabilidad de los contenedores es que la muestra de N elementos, más que la de la manipulación de la selección de un determinado i-ésimo elemento de los N elementos. El ListView ya era problemático si tuviera que crear una lista de los más complicados a los objetos que a simple filas. ¿Qué pasa si usted necesita para manejar diferentes eventos dependiendo de donde usted haga clic en el elemento ListView? Estás jodido. Aquí, usted tiene cada uno de los oyentes.
    • Estoy de acuerdo con @EpicPandaForce en este. También me vino a upvote esta respuesta después de leer la sección de Commonsware el libro sobre el manejo de los clics en RecyclerViews Se ha trabajado muy bien para mí hasta ahora.
    • El punto de vista de titular para que mantenga las referencias a los elementos que contiene. Si utiliza findViewById en onCreateViewHolder que estamos trabajando las intencional patrón.
    • findViewById sólo se utiliza en vista de la titular de la creación aquí (de ahí onCreateViewHolder). El titular de vista está destinada a prevenir el hallazgo de la vista cada vez que un artículo está enlazado con el titular, no en la creación inicial.
    • getPosition() está en desuso, uso getAdapterPosition() o getLayoutPosition() lugar.
    • Configuración haga clic en cualquier parte de la vista en RecyclerView.ViewHolder conduce a errores en el procesamiento de eventos de toque. Por ejemplo, si usted quiere poner en marcha SnapHelper para tales RecyclerView, OnClickListener anulará OnTouchListener en SnapHelper, y el último no recibir MotionEvent.ACTION_DOWN eventos.

  5. 93

    Basado en Jacob Tabak la respuesta (+1 para él), yo era capaz de agregar onLongClick oyente:

    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    public interface OnItemClickListener {
    void onItemClick(View view, int position);
    void onItemLongClick(View view, int position);
    }
    private OnItemClickListener mListener;
    private GestureDetector mGestureDetector;
    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
    return true;
    }
    @Override
    public void onLongPress(MotionEvent e) {
    View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null) {
    mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView));
    }
    }
    });
    }
    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
    mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
    }
    return false;
    }
    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
    }
    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
    }

    A continuación, se puede utilizar como esto:

    recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
    //...
    }
    @Override
    public void onItemLongClick(View view, int position) {
    //...
    }
    }));
    • Me tomó un tiempo para adaptarse a mi aplicación, y alinee y el formato de código para Java/Android normas, pero finalmente funcionó bien.
    • ¿Cómo agregar una animación para el largo haga clic en?
    • haga clic en el efecto no es de trabajo mediante el uso de este, aunque si hacemos clic en el oyente en el adaptador haga clic en efecto funciona con cualquier solución a este
    • Usted también debe reemplazar public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
    • Por alguna razón que no devuelve un clic de vista. En mi caso hago clic en una casilla de verificación, pero dado que la vista es algo diferente. De la manera que yo compruebe: view.getId() == R.id.selection
    • Me di cuenta de que la vista es un superior Layout para un list_item.xml. ¿Cómo puedo saber en qué exactamente view un clic fue?
    • getChildPosition() método está en desuso. Uso getChildAdapterPosition(Vista) o getChildLayoutPosition(Ver).

  6. 59

    Esto es lo que ha funcionado para mí. Conecte el OnClickListener a la onBindView. Realmente no sé si esto tendrá un impacto en el rendimiento, pero parece que funciona bien con poco código.

    public void onBindViewHolder(ViewHolder holder, final int position) {
    holder.view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    Toast.makeText(context, "Recycle Click" + position, Toast.LENGTH_SHORT).show();
    }
    });
    }
    • en mi caso el titular.itemView.setOnClickListener(..)
    • es llamado «itemView’ en lugar de ‘ver’ en mi caso, simplemente decir que para los principiantes, algunos de ellos, no entiendo lo que son copia, y no puedo entender por qué no funciona
    • Pregunta: El onBindViewHolder(…) devuelve un int posición. Qué posición es esto en lo que respecta a la RecyclerView? Es el Diseño de la Posición o la Posición del Adaptador?
    • Su posición de diseño
    • para mí, esto parece que sólo se aplicarán durante el último elemento visible no el artículo pulsado
    • Esta solución parece la mejor para mí, pero ¿cómo se diferencia esto de @bolot ‘s respuesta en termias de rendimiento? Se ha implementado la Vista.OnClickListener directamente en el ViewHolder clase, que escupe el método onClick por separado. Cual sería la mejor solución?
    • Este innecesariamente crea un nuevo OnClickListener constantemente mientras que el desplazamiento y por lo tanto no debe ser utilizado. Uso getAdapterPosition() para tener acceso al elemento de la posición de la haga clic en el oyente.
    • cuando se hace esto.
    • tiene ese método, por lo que puede utilizarse en cualquier oyente allí.
    • Desastre Total. Vas a comprar el artículo hacer clic posición del elemento que era ciego no el artículo que usted haga clic en

  7. 44

    Esto era tan difícil para mí tener sobre el elemento, haga clic en agente de escucha en la actividad y también han haga clic en agente de escucha de vista único del elemento que no se disparará en el elemento, haga clic en el oyente. Después de jugar con Jacob Tabak la respuesta que yo respeto su respuesta para que en el elemento, haga clic en si ningún otro toque acciones en el interior del elemento se presentan.

    Tengo una costumbre OnClickListener interfaz que tiene sobre el elemento, haga clic en evento que tiene el hecho clic en el elemento de la vista y la posición del elemento de la adaptador. Puedo presentar una instancia en el constructor(o puede ser con setter) y adjuntarlo a la vista del titular del contenedor haga clic en el oyente.

    También tengo otras oyente haga clic en el Adaptador(Puede ser en la vista de titular) que se encargará de Vista actual, haga clic en el contenedor.

     public class MyRecyclerAdapter extends RecyclerView.Adapter<MyViewHolder> {
    private ArrayList<String> mData;
    private OnItemClickListener mOnItemClickListener;
    public interface OnItemClickListener {
    public void onItemClick(View view, int position);
    }
    public MyRecyclerAdapter(ArrayList<String> itemsData,
    OnItemClickListener onItemClickListener) {
    mOnItemClickListener = onItemClickListener;
    this.mData = itemsData;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent,
    int viewType) {
    View layoutView = LayoutInflater.from(mContext).inflate(
    R.layout.list_item, parent, false);
    MyViewHolder viewHolder = new MyViewHolder(layoutView);
    return viewHolder;
    }
    @Override
    public void onBindViewHolder(MyViewHolder viewHolder,
    final int position) {
    viewHolder.container.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    mOnItemClickListener.onItemClick(v, position);
    }
    });
    viewHilder.button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    //do button click work here
    }
    });
    }
    @Override
    public int getItemCount() {
    return mData.size();
    }}

    En la actividad que necesita para inicializar el adaptador pasando instancia de la OnItemClickListener

    public class FeedActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    .....
    MyRecyclerAdapter adapter = new MyRecyclerAdapter(new ArrayList<String>(), new OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
    ///list item was clicked
    }
    });
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(mFeedsAdapter);
    }

    Y mi ViewHolder

    public class MyViewHolder extends RecyclerView.ViewHolder {
    public Button button;
    public View container;
    public MyViewHolder(View itemLayoutView) {
    super(itemLayoutView);
    container = itemLayoutView;
    button = (Button) itemLayoutView.findViewById(R.id.button);
    }}
    • Este enfoque ha funcionado bien para mí – esto significa que usted puede manejar los clics en la actividad, más que dentro de la vista de cuadrícula
    • Donde puedo darle el dinero. 4 horas de búsqueda y, a continuación, leí tu post. Gracias por el tiempo que tomó para publicar esto.
    • Esto suena estúpido, pero, ¿esto tiene alguna memoria o la eficiencia como problema? Porque estamos asignando el clic escucha cada vez que un punto de vista está siendo dibujado a la derecha?
    • sí cada vez que la vista se unen a un nuevo haga clic en el oyente está asignado, pero este es el estándar de flujo. Pero el mOnItemClickListener se crea sólo una vez para el adaptador de la vista y su posición son diferentes en cada elemento, haga clic en 😉
    • Gracias, esto realmente me ayudó a entender cómo implementar Interfaces OnClickListener
    • el envase debe ser WeakReference<Ver>. El Contexto (su actividad) contiene una referencia a la reciclador de vista, que contiene una referencia a la vista del titular que, en este caso, tiene una referencia al contexto.
    • el envase es diferente para cada elemento y es necesaria para asignar el onclick escucha a ella. El RecyclerView debe reciclar el ViewHolder si es necesario…
    • Gran ejemplo para matar el rendimiento de la aplicación y crear memoria uso excesivo! Con este ejemplo, usted sólo necesita desplazarse para crear cientos de objetos inútiles, que en un momento va a ser de utilidad y se accede a ellos como garbige. @NoobDogg que es correcto. No ClickListeners no ha de ser creado en onBindView. Un clic en el oyente tiene que ser creado de una vez en onCreateView (o titular constructor), y existe, mientras que necesitamos pantalla con este adaptador.
    • ¿cómo va a realizar el oyente haga clic en un elemento, cuando usted no tiene su posición en onCreateView?! Usted necesita saber qué elemento se ha hecho clic y tener su posición de modo que usted puede tener acceso a los datos. Usted simplemente no está bien
    • NIkolay Cesar El Primero, al primer aviso de que el problema de la creación de un gran número de objetos (ClickListeners) con muy poco tiempo de vida. Su sobrecarga y antipattern – ¡siempre! Cuando se ejecuta onCreateViewHolder su ejecutan ViewHolder constructor, y dentro de ella tienes que crear haga clic en lstener. Dentro del método onClick puede llamar getAdapterPosition y realizar con este índice se obtiene de la recolección de datos. En este caso ClickListeners se creará tanto como ViewHolders.
    • Para obtener la posición del elemento dentro de onCreateView (de modo que haga clic en el oyente puede estar sujeto allí), usted simplemente tiene que tener otra propiedad dentro de su ViewHolder que captura el índice, o algunos otros metadatos que proporciona una «manija» a ese elemento, durante onBindViewHolder. Esto es todo lo que hago. No hay necesidad de repetir la unión de los oyentes, y no hay necesidad de saltar a través de cualquier aros para calcular el artículo pulsado. Estoy absolutamente escalonados que ninguna de estas respuestas ilustrar esto.
    • Cómo pasar el titular de los valores a través de la intención?

  8. 29

    Esto es lo que me acabó necesitando, en caso de que alguien la encuentre útil:

    public static class ViewHolder extends RecyclerView.ViewHolder {
    public ViewHolder(View item) {
    super(item);
    item.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    Log.d("RecyclerView", "onClick:" + getAdapterPosition());
    }
    });
    }
    }

    Fuente: http://blog.csdn.net/jwzhangjie/article/details/36868515

    • De todas las versiones que he probado, este es el que me puse a trabajar. Pero está bien, hacerlo de esa manera? O hay una mejor manera, como mejor práctica?
    • Como lo que yo podría decir, esta era la única manera. Compruebe esto hacia fuera para más detalles! stackoverflow.com/a/24933117/1508887
    • ¿Cómo puedo abrir nuevo fragmento desde el interior de método onclick?
    • getPosition() es obsoleto ahora
    • getAdapterPosition() sustituye a getPosition()
  9. 25

    Tengo solución agradable para RecyclerView‘s onItemClickListener de los elementos y subelementos

    Paso 1- Crear una interfaz

    public interface OnRecyclerViewItemClickListener
    {
    /**
    * Called when any item with in recyclerview or any item with in item
    * clicked
    * 
    * @param position
    *            The position of the item
    * @param id
    *            The id of the view which is clicked with in the item or
    *            -1 if the item itself clicked
    */
    public void onRecyclerViewItemClicked(int position, int id);
    }

    Paso 2- Luego usarlo en el adaptador de onBindViewHolder método de la siguiente manera

    /**
    * Custom created method for Setting the item click listener for the items and items with in items
    * @param listener OnRecyclerViewItemClickListener 
    */
    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener)
    {
    this.listener = listener;
    }
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position)
    {
    //viewHolder.albumBg.setBackgroundResource(_itemData[position]
    //.getImageUrl());
    viewHolder.albumName.setText(arrayList.get(position).getName());
    viewHolder.artistName.setText(arrayList.get(position).getArtistName());
    String imgUrl = arrayList.get(position).getThumbImageUrl();
    makeImageRequest(imgUrl, viewHolder);
    viewHolder.parentView.setOnClickListener(new View.OnClickListener()
    {
    @Override
    public void onClick(View v)
    {
    listener.onRecyclerViewItemClicked(position, -1);
    }
    });
    viewHolder.settingButton.setOnClickListener(new View.OnClickListener()
    {
    @Override
    public void onClick(View v)
    {
    listener.onRecyclerViewItemClicked(position, v.getId());
    }
    });
    }
    //class to hold a reference to each item of RecyclerView
    public static class ViewHolder extends RecyclerView.ViewHolder
    {
    public TextView albumName, artistName;
    public ImageView albumIcon, settingButton;
    public LinearLayout parentView;
    public ViewHolder(View itemLayoutView)
    {
    super(itemLayoutView);
    //albumBg = (LinearLayout) itemLayoutView
    //.findViewById(R.id.albumDlbg);
    albumName = (TextView) itemLayoutView.findViewById(R.id.albumName);
    artistName = (TextView) itemLayoutView
    .findViewById(R.id.artistName);
    albumIcon = (ImageView) itemLayoutView.findViewById(R.id.albumIcon);
    parentView = (LinearLayout) itemLayoutView
    .findViewById(R.id.albumDlbg);
    settingButton = (ImageView) itemLayoutView
    .findViewById(R.id.settingBtn);
    }
    }

    Paso 3- encontrar y la instalación de reciclado de vista en la actividad o el fragmento en el que se utiliza este

    recyclerView = (RecyclerView) rootview.findViewById(R.id.vmtopsongs);
    lm = new LinearLayoutManager(mActivity);
    lm.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(lm);
    recyclerView.addItemDecoration(
    new HorizontalDividerItemDecoration.Builder(getActivity())
    .paint(Utils.getPaint()).build());
    PopularSongsadapter mAdapter = new PopularSongsadapter(gallery,
    mActivity, true);
    //set adapter
    recyclerView.setAdapter(mAdapter);
    mAdapter.setOnItemClickListener(this);
    //set item animator to DefaultAnimator
    recyclerView.setItemAnimator(new DefaultItemAnimator());

    Paso 4- Finalmente implementar la interfaz en la actividad o el fragmento en el que se utiliza el recyclerview

    @Override
    public void onRecyclerViewItemClicked(int position, int id)
    {
    if(id==-1){
    Toast.makeText(mActivity, "complete item clicked", Toast.LENGTH_LONG).show();
    }else{
    Toast.makeText(mActivity, "setting button clicked", Toast.LENGTH_LONG).show();
    }
    }
    • Esta es la mejor solución ya que por lo general necesitan una gran cantidad de propiedades a partir de la actividad/fragmento de nuestro onItemClickListener, y no hay ningún sentido para llamar directamente desde el viewholder (tendría que crear un constructor personalizado para cada adaptador). Por cierto, el código es un poco extensa, te sugiero que para cortar la parte más importante (setOnItemClickListener).
    • este es un buen método sencillo para la diferenciación de la fila / elemento de la sub-elementos
  10. 16

    Aquí es lo que yo hice. Esta solución es compatible con ambos onClick y onLongClick en ambos RecyclerView Elementos y puntos de vista interior RecyclerView Elementos (interno vistas).

    Me etiqueta viewHolder en las vistas de mi elección :

    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_item, null);
    ViewHolder viewHolder = new ViewHolder(itemView);
    itemView.setOnClickListener( this);
    itemView.setOnLongClickListener(this);
    viewHolder.imageIV.setOnClickListener(this);
    viewHolder.imageIV.setOnLongClickListener(this);
    viewHolder.imageIV.setTag(viewHolder);
    itemView.setTag(viewHolder);
    return viewHolder;
    }

    Y uso de titular.getPosition() para recuperar la posición en el onClick (), método (onLongClick es similar) :

    public void onClick(View view) {
    ViewHolder holder = (ViewHolder) view.getTag();
    int position = holder.getPosition();
    if (view.getId() == holder.imageIV.getId()){
    Toast.makeText(context, "imageIV onClick at" + position, Toast.LENGTH_SHORT).show();
    } else {
    Toast.makeText(context, "RecyclerView Item onClick at " + position, Toast.LENGTH_SHORT).show();
    }
    }

    Una variante con getChildPosition también funciona. Por favor, tenga en cuenta que para el interno de opiniones, en el onClick() uso :

    int position = recyclerView.getChildPosition((View)view.getParent());

    A mi mente, el avantage de esta solución es que cuando uno hace clic sobre la imagen, sólo el onclick() de la imagen de escucha se llama, mientras que cuando los he combinado de Jacob solución para un RecyclerView Punto de vista y mi solución para la interna vistas a la RecyclerView Punto de vista onclick() es llamado también (cuando haga clic sobre la imagen).

  11. 11

    Allí es mucho más fácil manera de hacer esto. Sólo se aplica en haga clic en en onBindViewHolder la raíz de vista.

    Considerar este es su punto de vista para el adaptador,

    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/linearlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
    android:id="@+id/textview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="1dp"
    android:textSize="15sp" />
    </LinearLayout>

    A continuación, haga lo siguiente en su adaptador

    //get the layout and make view holder
    @Override
    public RVAdapter.ViewHolder1 onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, null);
    ViewHolder1 viewHolder = new ViewHolder1(view);
    return viewHolder;
    }
    @Override
    public void onBindViewHolder(RVAdapter.ViewHolder1 holder, int position) {
    //apply on click on your root view
    holder.linearlayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    //Do on click stuff
    }
    });
    }
    //make references to views in layout including root view
    public class ViewHolder1 extends RecyclerView.ViewHolder {
    protected LinearLayout linearlayout = null
    protected TextView textview = null;
    public CareerLinksViewHolder(View itemView) {
    super(itemView);
    this.linearlayout = (LinearLayout) itemView.findViewById(R.id.linearlayout);
    this.tvCompName = (TextView) itemView.findViewById(R.id.textview);
    }
    }
  12. 9

    Puede pasar un clickListener a Adapter.

    En su Activity:

    private View.OnClickListener mItemClick = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = null;
    int position = list.getChildPosition(v);
    switch (position) {
    case 0:
    intent = new Intent(MainActivity.this, LeakCanaryActivity.class);
    break;
    case 1:
    intent = new Intent(MainActivity.this, ButterKnifeFragmentActivity.class);
    break;
    }
    if (intent != null) {
    MainActivity.this.startActivity(intent);
    }
    }
    };

    a continuación, pasar a Adapter:

    MainAdapter mainAdapter = new MainAdapter(this, mItemClick);

    En Adapter‘s onCreateViewHolder:

     @Override
    public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
    View itemView = activity.getLayoutInflater().inflate(R.layout.main_adapter_item, viewGroup, false);
    ViewHolder holder = new ViewHolder(itemView);
    itemView.setOnClickListener(mItemClick);
    return holder;
    }
    • ¿Cómo se pasa el holder valores a través de la intención?
  13. 8

    He desarrollado un peso ligero de la biblioteca para android, usted puede visitar https://github.com/ChathuraHettiarachchi/RecycleClick

    y seguir la siguiente muestra

    RecycleClick.addTo(YOUR_RECYCLEVIEW).setOnItemClickListener(new RecycleClick.OnItemClickListener() {
    @Override
    public void onItemClicked(RecyclerView recyclerView, int position, View v) {
    //YOUR CODE
    }
    });
    • Puede confirmar, esta biblioteca es genial!!! Muy fácil de usar, buen trabajo!
  14. 7

    Puede implementar OnClickListener para su ViewHolder clase

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    public Item item
    @InjectView(R.id.tv_title)
    public TextView tvTitle;
    @InjectView(R.id.rl_row)
    public RelativeLayout rlRow;
    public ViewHolder(View v) {
    super(v);
    ButterKnife.inject(this, v);
    v.setOnClickListener(this);
    }
    @Override
    public void onClick(View view) {
    Log.e("item title",item.getTitle());
    }
    }

    Y onBindViewHolder establecer su punto de vista del titular de elemento

    public void onBindViewHolder(ViewHolder holder, int position) {
    holder.tvTitle.setText(objects.get(position).getTitle());
    holder.item = objects.get(position);
    }
  15. 7

    Manera muy simple y eficaz.

    Lugar de implementar la interfaz View.OnClickListener dentro de la vista de titular o de la creación y de la interfaz y la implementación de la interfaz en su actividad
    He utilizado este código, por simple en OnClickListener aplicación.

    public static class SimpleStringRecyclerViewAdapter
    extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> {
    //Your initializations goes here...
    private List<String> mValues;
    public static class ViewHolder extends RecyclerView.ViewHolder {
    //create a variable mView
    public final View mView;
    /*All your row widgets goes here
    public final ImageView mImageView;
    public final TextView mTextView;*/
    public ViewHolder(View view) {
    super(view);
    //Initialize it here
    mView = view;
    /* your row widgets initializations goes here
    mImageView = (ImageView) view.findViewById(R.id.avatar);
    mTextView = (TextView) view.findViewById(android.R.id.text1);*/
    }
    }
    public String getValueAt(int position) {
    return mValues.get(position);
    }
    public SimpleStringRecyclerViewAdapter(Context context, List<String> items) {
    mBackground = mTypedValue.resourceId;
    mValues = items;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
    .inflate(R.layout.list_item, parent, false);
    view.setBackgroundResource(mBackground);
    return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.mBoundString = mValues.get(position);
    holder.mTextView.setText(mValues.get(position));
    //Here it is simply write onItemClick listener here
    holder.mView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Context context = v.getContext();
    Intent intent = new Intent(context, ExampleActivity.class);
    context.startActivity(intent);
    }
    });
    }
    @Override
    public int getItemCount() {
    return mValues.size();
    }
    }
    • Esta es una mala práctica porque se ve de manera muy fácil. Se está creando un nuevo interior escucha cada vez que un objeto está designada (y cada elemento en una empresa de reciclaje puede ser obligado muchas veces) de lo que es malo para el rendimiento b)recolección de basura. En lugar usted debe crear UNO escucha en algún lugar (en el viewholder, en el adaptador, en la parte superior del fragmento o actividad) y acaba de añadir a los elementos de la viewholder constructor en onCreateViewHolder. Esto tiene la complejidad añadida de tener que determinar qué elemento se clicker, pero puede ser resuelto fácilmente a través de las etiquetas o la adición de más información para el titular.
  16. 6

    Todas las respuestas publicadas hasta el momento son las grandes soluciones, sin embargo, si usted no quiere tratar con demasiados detalles de la implementación, y solo quiero que funcionan de manera similar a cómo ListView no recomendaría el uso de TwoWay de Vista, como se ve aquí:

    https://github.com/lucasr/twoway-view

    Tenga en cuenta que esta aplicación también es compatible pulsación larga en los artículos, así como el apoyo para el prensado de los estados (que es algo importante que otras soluciones a esta cuestión de la falta).

    Si no desea utilizar la totalidad de la biblioteca, echa un vistazo a la ClickItemTouchListener clase, que puede ser utilizado como un independiente si es necesario. El único problema que me encontré con él en este momento es con pulsación larga + desplazamiento, parece tener comportamientos incorrectos.

  17. 6

    Si quieres coger el evento de clic En los elementos Individuales, a continuación, acaba de implementar OnClickListener en ViewHolder de la clase y, a continuación, haga clic en establecer los oyentes sobre las opiniones de cada uno o todo el itemView.

    Siguiente ejemplo muestra el mismo

    public  class ContactViewHolder extends RecyclerView.ViewHolder implements OnClickListener
    {
    TextView txt_title,txt_name,txt_email;
    public ContactViewHolder(View itemView) 
    {
    super(itemView);
    txt_title = (TextView)itemView.findViewById(R.id.txt_title);
    txt_name  = (TextView)itemView.findViewById(R.id.txt_name);
    txt_email = (TextView)itemView.findViewById(R.id.txt_email);
    txt_name.setOnClickListener(this);
    txt_email.setOnClickListener(this);
    itemView.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
    //TODO Auto-generated method stub
    if(v == itemView)
    {
    Toast.makeText(RecyclerDemoActivity.this, "Visiting Card Clicked is ==>"+txt_name.getText(), Toast.LENGTH_SHORT).show();
    }
    if(v == txt_name)
    {
    Toast.makeText(RecyclerDemoActivity.this, "Name ==>"+txt_name.getText(), Toast.LENGTH_SHORT).show();
    }
    if(v == txt_email)
    {
    Toast.makeText(RecyclerDemoActivity.this, "Email ==>"+txt_email.getText(), Toast.LENGTH_SHORT).show();
    }
    }
    }
    } 
  18. 5

    Para mí, esta es la mejor manera:

    class YourRecyclerAdapter extends RecyclerView.Adapter<ContactViewHolder> implements View.OnClickListener { 
    ...
    @Override
    public void onClick(View view) {
    int itemPosition = vRecycle.getChildPosition(view);
    //And use itemPosition to get the item from your collection. This way you dont restrain the ViewHolder with a OnClick callback
    }
    ...
    }
    • getChildPosition() es decapitado
  19. 5

    La RecyclerView no tiene un OnClickListener y tendrá que implementar nosotros mismos.

    Me gustaría añadir una OnItemClickListener interfaz en Adapter con un onClick método se invoca cuando se hace clic en el punto de vista de la ViewHolder. Por lo tanto la responsabilidad de la gestión de la haga clic en un elemento que está fuera de la ViewHolder y Adapter. Será la actividad o el fragmento que va a decidir qué hacer

    Agregar una interfaz a la escucha, y la escucha de objeto.

    public class ItemsAdapter extends RecyclerView.Adapter<ItemsAdapter.ViewHolder> {
    ...
    private static OnItemClickListener onItemClickListener;
    ...
    public static interface OnItemClickListener {
    public void onItemClick(View view, int position);
    }
    ...
    }

    Que la captura de el clic de la raíz de la vista de la pieza y cuando la devolución de llamada se activa onClick escucha de llamadas en el adaptador .

    public class ItemsAdapter extends RecyclerView.Adapter<ItemsAdapter.ViewHolder> {
    ...
    private static OnItemClickListener onItemClickListener;
    ...
    public static interface OnItemClickListener {
    public void onItemClick(View view, int position);
    }
    ...
    public static class ViewHolder extends RecyclerView.ViewHolder {
    public ImageView imageView;
    public ViewHolder(View itemRootView) {
    super(itemRootView);
    imageView = (ImageView) itemRootView.findViewById(R.id.itemImage);
    itemRootView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    int position  = ViewHolder.super.getAdapterPosition();
    onItemClickListener.onItemClick(view,position);
    }
    });
    }
    }
    }

    Dado que la actividad o fragmento de fragmento en nuestro caso , se asigna un listener para el adaptador y el onClick de devolución de llamada para obtener el elemento seleccionado por la posición y abrió una actividad detallada de elemento.

    public class ItemsFragment extends Fragment {
    ...
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    ...    
    ((ItemsAdapter) adapter).setOnItemClickListener(new ItemsAdapter.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
    //Do something when an item has been clicked
    }
    });
    ...
    }
    ...
    }
  20. 5

    Lamentablemente RecyclerView le falta un par de características que ListView había incorporado.
    Por ejemplo, la capacidad para agregar un OnItemClickListener que se dispara cuando un elemento se hace clic.
    RecyclerView permite establecer un OnClickListener en su adaptador, pero que pasa en que haga clic en
    escucha a partir de su código de llamada, para el adaptador y en el ViewHolder, es complicado
    para la captura de un elemento simple clic.

    public class ItemClickSupport {
    private final RecyclerView mRecyclerView;
    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;
    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    if (mOnItemClickListener != null) {
    RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
    mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
    }
    }
    };
    private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
    if (mOnItemLongClickListener != null) {
    RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
    return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
    }
    return false;
    }
    };
    private RecyclerView.OnChildAttachStateChangeListener mAttachListener
    = new RecyclerView.OnChildAttachStateChangeListener() {
    @Override
    public void onChildViewAttachedToWindow(View view) {
    if (mOnItemClickListener != null) {
    view.setOnClickListener(mOnClickListener);
    }
    if (mOnItemLongClickListener != null) {
    view.setOnLongClickListener(mOnLongClickListener);
    }
    }
    @Override
    public void onChildViewDetachedFromWindow(View view) {
    }
    };
    private ItemClickSupport(RecyclerView recyclerView) {
    mRecyclerView = recyclerView;
    mRecyclerView.setTag(R.id.item_click_support, this);
    mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
    }
    public static ItemClickSupport addTo(RecyclerView view) {
    ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
    if (support == null) {
    support = new ItemClickSupport(view);
    }
    return support;
    }
    public static ItemClickSupport removeFrom(RecyclerView view) {
    ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
    if (support != null) {
    support.detach(view);
    }
    return support;
    }
    public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
    mOnItemClickListener = listener;
    return this;
    }
    public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
    mOnItemLongClickListener = listener;
    return this;
    }
    private void detach(RecyclerView view) {
    view.removeOnChildAttachStateChangeListener(mAttachListener);
    view.setTag(R.id.item_click_support, null);
    }
    public interface OnItemClickListener {
    void onItemClicked(RecyclerView recyclerView, int position, View v);
    }
    public interface OnItemLongClickListener {
    boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);
    }
    }

    También es necesario definir R.id.item_click_support el uso de ids.xml:

     <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <item name="item_click_support" type="id" />
    </resources>

    El código resultante haga clic en escucha ahora este aspecto:

    ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
    @Override
    public void onItemClicked(RecyclerView recyclerView, int position, View v) {
    //do it
    }
    });

    Para una Breve Explicación acerca de recyclerview clics por favor, eche un vistazo a este littlerobots_blog

  21. 5

    usted puede definir fácilmente setOnClickListener en su ViewHolder de clase como sigue :

    public class ViewHolder extends RecyclerView.ViewHolder {
    TextView product_name;
    ViewHolder(View itemView) {
    super(itemView);
    product_name = (TextView) itemView.findViewById(R.id.product_name);
    itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    int itemPosition = getLayoutPosition();
    Toast.makeText(getApplicationContext(), itemPosition + ":" + String.valueOf(product_name.getText()), Toast.LENGTH_SHORT).show();
    }
    });
    }
    }
  22. 5

    Aquí es lo que yo hice Leer más & descargar el gist aquí

    La adición de la misma aquí

    CustomItemClickListener.java

    public interface CustomItemClickListener {
    public void onItemClick(View v, int position);
    }

    ItemsListAdapter.java

    public class ItemsListAdapter extends RecyclerView.Adapter<ItemsListAdapter.ViewHolder> {
    ArrayList<ItemListSingleItem> data;
    Context mContext;
    CustomItemClickListener listener;
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View mView = LayoutInflater.from(parent.getContext()).inflate(R.layout.items_list_single_item, parent, false);
    final ViewHolder mViewHolder = new ViewHolder(mView);
    mView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    listener.onItemClick(v, mViewHolder.getAdapterPosition());
    }
    });
    return mViewHolder;
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    holder.itemTitle.setText(Html.fromHtml(data.get(position).getTitle()));
    if (!TextUtils.isEmpty(data.get(position).getThumbnailURL())) {
    //I Love picasso library :) http://square.github.io/picasso/
    Picasso.with(mContext).load(data.get(position).getThumbnailURL()).error(R.drawable.ic_no_image).
    placeholder(R.drawable.ic_no_image).
    transform(new RoundedCornersTransformation(5, 0)).
    into(holder.thumbnailImage);
    } else {
    holder.thumbnailImage.setImageResource(R.drawable.ic_no_image);
    }
    }
    @Override
    public int getItemCount() {
    return data.size();
    }
    public ItemsListAdapter(Context mContext, ArrayList<ItemsListSingleItem> data, CustomItemClickListener listener) {
    this.data = data;
    this.mContext = mContext;
    this.listener = listener;
    }
    public static class ViewHolder extends RecyclerView.ViewHolder {
    public TextView itemTitle;
    public ImageView thumbnailImage;
    ViewHolder(View v) {
    super(v);
    itemTitle = (TextView) v
    .findViewById(R.id.post_title);
    thumbnailImage = (ImageView) v.findViewById(R.id.post_thumb_image);
    }
    }
    }
  23. 4

    De la mayoría de las respuestas de arriba, que parece ser el establecimiento de sus onclicklisteners a los elementos individuales. Sin embargo, la solución que voy a ofrecer es muy simple, pero sin embargo, no es intuitivo para muchos. Muchos se están olvidando de que los demás componentes son siempre en un componente principal que se utiliza para mostrar los elementos en la Lista o Reciclador de vistas. Esta solución es sólo acerca de la configuración de un solo onclick escucha a este padre de la vista y la vuelta se juega. La solución también incluye una forma de pasar de la posición del elemento de que se hace clic en en la lista o reciclador de vista. Aquí, nuestro principal rootview es un CardView desde el android support library. Aquí es el ejemplo de código

    public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {
    public static final String LOG_TAG = ListAdapter.class.getSimpleName();
    private Cursor mDataset;
    private Context mContext;
    private ViewHolder mViewHolder;
    //Provide a suitable constructor (depends on the kind of dataset)
    public ListAdapter(Context context, Cursor Dataset) {
    mDataset = Dataset;
    mContext = context;
    }
    //Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //create a new view
    View v = LayoutInflater.from(parent.getContext())
    .inflate(R.layout.list_business_view, parent, false);
    mViewHolder = new ViewHolder(v);
    return mViewHolder;
    }
    public void setData(Cursor newdata) {
    this.mDataset = newdata;
    }
    //Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    //Bind data to other items here. To save time, i have ommited that.
    //here is where we attach a click listerner for an item in the recycler list rather than for each element of a given item.
    holder.card.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(mContext, " Just cliked item at position " + itemPosition, Toast.LENGTH_LONG).show();
    }
    });
    }
    }
    //Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
    if (null != mDataset) {
    return mDataset.getCount();
    }
    return 0;
    }
    //Provide a reference to the views for each data item
    //Complex data items may need more than one view per item, and
    //you provide access to all the views for a data item in a view holder
    public static class ViewHolder extends RecyclerView.ViewHolder{
    //each data item is just a string in this case
    public final TextView mBusinesssName; //View for the business name
    public final TextView mBusinessCategory; //View for the category name
    public final ImageView businessImage; //View for the business category image Image
    public final TextView mBusinessDistance; //View for the distance
    public final CardView card;
    public ViewHolder(View view) {
    super(view);
    mBusinesssName = (TextView) view.findViewById(R.id.list_item_name_textview);
    mBusinessCategory = (TextView) view.findViewById(R.id.list_item_category_textview);
    mBusinessDistance = (TextView) view.findViewById(R.id.list_item_dist_textview);
    businessImage = (ImageView) view.findViewById(R.id.list_item_icon);
    card = (CardView) view.findViewById(R.id.card_view);
    }
    }
    }
  24. 3

    Kotlin implementación de nhaarman del respuesta :

    mRecyclerView.addOnItemTouchListener(object  : RecyclerItemClickListener(this, mRecyclerView,object :RecyclerItemClickListener.OnItemClickListener{
    override fun onItemClick(view: View, position: Int) {
    }
    override fun onLongItemClick(view: View?, position: Int) {
    }
    }){})

    RecyclerItemClickListener.java :

    import android.content.Context
    import android.support.v7.widget.RecyclerView
    import android.view.GestureDetector
    import android.view.MotionEvent
    import android.view.View
    open class RecyclerItemClickListener(context: Context, recyclerView: RecyclerView, private val mListener: OnItemClickListener?) : RecyclerView.OnItemTouchListener {
    private var mGestureDetector: GestureDetector
    interface OnItemClickListener {
    fun onItemClick(view: View, position: Int)
    fun onLongItemClick(view: View?, position: Int)
    }
    init {
    mGestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
    override fun onSingleTapUp(e: MotionEvent): Boolean {
    return true
    }
    override fun onLongPress(e: MotionEvent) {
    val child = recyclerView.findChildViewUnder(e.x, e.y)
    if (child != null && mListener != null) {
    mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child))
    }
    }
    })
    }
    override fun onInterceptTouchEvent(view: RecyclerView, e: MotionEvent): Boolean {
    val childView = view.findChildViewUnder(e.x, e.y)
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
    mListener.onItemClick(childView, view.getChildAdapterPosition(childView))
    return true
    }
    return false
    }
    override fun onTouchEvent(view: RecyclerView, motionEvent: MotionEvent) {}
    override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
    }
  25. 3
    public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title, year, genre;
    public MyViewHolder(View view) {
    super(view);
    title = (TextView) view.findViewById(R.id.title);
    genre = (TextView) view.findViewById(R.id.genre);
    year = (TextView) view.findViewById(R.id.year);
    view.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(context, ""+getAdapterPosition(), Toast.LENGTH_SHORT).show();
    }
    });
    }
    }
  26. 3

    aquí es el código completo de mi adaptador personalizado de este código se inflan las filas con los elementos de la lista definida en el archivo xml llamado «list_item» también va a realizar el evento de clic en todos los elementos de la lista de las filas con las respectivas posiciones.

    public class MyCustomAdapter extends RecyclerView.Adapter`<`AdapterMyCustomAdapter.ViewHolder> {
    public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
    public onItemClickListener mListener;
    public ViewHolder(View v, onItemClickListener listener) {
    super(v);
    mListener =listener;
    v.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
    mListener.onRecyclerItemClick(v, getPosition());
    }
    public static interface onItemClickListener {
    public void onRecyclerItemClick(View view , int position);
    }
    }
    @Override
    public int getItemCount() {
    return 5;
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int pos) {      
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
    View v = LayoutInflater.from(parent.getContext())
    .inflate(R.layout.list_item, parent, false);
    /* here list_item is an xml file we want to inflate ...it is same as we do in case of listview for customization.*/
    MyCustomAdapter.ViewHolder vh = new ViewHolder(v, new MyCustomAdapter.ViewHolder.onItemClickListener() {
    @Override
    public void onRecyclerItemClick(View view, int position) {
    System.out.println("clicked on list item at position " +position);
    } 
    });
    return vh;
    }
    }
  27. 2

    Soy consciente de que hay un montón de respuestas, pero pensé que podría brindar la implementación de mi es así. (Los detalles completos se pueden encontrar en otra pregunta que me respondió).

    Así, para agregar un clic de escucha, su interior ViewHolder las necesidades de la clase para implementar View.OnClickListener. Esto es debido a que se establezca un OnClickListener a la itemView parámetro de la ViewHolder‘s constructor. Déjame mostrarte lo que quiero decir:

    public class ExampleClickViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView text1, text2;
    ExampleClickViewHolder(View itemView) {
    super(itemView);
    //we do this because we want to check when an item has been clicked:
    itemView.setOnClickListener(this);
    //now, like before, we assign our View variables
    title = (TextView) itemView.findViewById(R.id.text1);
    subtitle = (TextView) itemView.findViewById(R.id.text2);
    }
    @Override
    public void onClick(View v) {
    //The user may not set a click listener for list items, in which case our listener
    //will be null, so we need to check for this
    if (mOnEntryClickListener != null) {
    mOnEntryClickListener.onEntryClick(v, getLayoutPosition());
    }
    }
    }

    La única otra cosa que usted necesita para agregar una interfaz personalizada para su Adapter y un método setter:

    private OnEntryClickListener mOnEntryClickListener;
    public interface OnEntryClickListener {
    void onEntryClick(View view, int position);
    }
    public void setOnEntryClickListener(OnEntryClickListener onEntryClickListener) {
    mOnEntryClickListener = onEntryClickListener;
    }

    De forma que la nueva, haga clic en-apoyo Adapter es completa.

    Ahora, vamos a usar…

        ExampleClickAdapter clickAdapter = new ExampleClickAdapter(yourObjects);
    clickAdapter.setOnEntryClickListener(new ExampleClickAdapter.OnEntryClickListener() {
    @Override
    public void onEntryClick(View view, int position) {
    //stuff that will happen when a list item is clicked
    }
    });

    Se trata básicamente de cómo configurar una normal Adapter, excepto que usted use el método setter que creó para el control de lo que va a hacer cuando el usuario hace clic en un determinado elemento de la lista.

    También puede buscar a través de un conjunto de ejemplos que hice en este Gist en GitHub:

    https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07

    • Usted debe utilizar getAdapterPosition() en lugar de getLayoutPosition()
  28. 2

    Esto es lo que tengo que hacer para reutilizar OnClickListener

      public class TestAdapter extends RecyclerView.Adapter<TestAdapter.MyviewHolder>
    implements View.OnClickListener

    en ViewHoder Tomar itemlayout del padre

      public class MyviewHolder extends RecyclerView.ViewHolder {
    LinearLayout linearLayout_item;
    public MyviewHolder(View itemView) {
    super(itemView);
    linearLayout_item=itemView.findViewById(R.id.linearLayout_item);
    }
    }

    en onBindViewHolder conjunto de etiquetas como la posición

       @Override
    public void onBindViewHolder(MyviewHolder holder, int position) {
    holder.linearLayout_item.setTag(position);
    holder.linearLayout_item.setOnClickListener(this);
    }

    y en Onclick

     @Override
    public void onClick(View v) {
    int position = (int) v.getTag();
    switch (v.getId()) {
    case R.id.linearLayout_item:
    //do some thing with position 
    break;
    }
    }
  29. 2

    Para mí la manera correcta de hacerlo es esta.

    Adaptador constructor

    private class EnvironmentTypeRecyclerViewAdapter extends RecyclerView.Adapter<EnvironmentTypeRecyclerViewAdapter.ViewHolder>
    {
    private final EnvironmentTypeRecyclerViewAdapterListener mEnvironmentTypeRecyclerViewAdapterListener;
    private List<Environment> mEnvironmentsData;
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    {
    public ViewHolder(View v)
    {
    super(v);
    v.setOnClickListener(this);
    }
    @Override
    public void onClick(View v)
    {
    Environment environment = mEnvironmentsData.get(getAdapterPosition());
    if (mEnvironmentTypeRecyclerViewAdapterListener != null && environment != null) {
    mEnvironmentTypeRecyclerViewAdapterListener.onListItemSelected(environment);      
    }
    }
    public EnvironmentTypeRecyclerViewAdapter(List<SmallCellEnvironment> environments, EnvironmentTypeRecyclerViewAdapterListener environmentTypeRecyclerViewAdapterListener)
    {
    mEnvironmentTypeRecyclerViewAdapterListener = environmentTypeRecyclerViewAdapterListener;
    mEnvironmentsData = environments;
    }
    }

    Los Enlaces De La Interfaz De

    private interface EnvironmentTypeRecyclerViewAdapterListener
    {
    void onListItemSelected(Environment environment);
    }
  30. 1

    Podemos hacer esto utilizando Java referencias débiles.
    Semánticamente, el titular de vista es el que debe responder al evento click o delegado a la correcta respuesta.

    Nuestros objetivos:

    1. La Viewholder debe saber nada acerca de la clase de los thats de responder a los eventos, excepto que implementa una interfaz determinada.
    2. Haga clic en el controlador debe obtener la posición en el RecyclerView de la vista de eso se ha hecho clic.
    3. Debemos ser capaces de discernir que vista se hace clic en la vista de titular.
    4. Mantener un acoplamiento flexible entre todos los componentes y no causa ningún conservar los ciclos.

    Pasos:

    1. Crear una interfaz para manejar haga clic en las respuestas.

    2. Implementar esta interfaz en la Actividad que va a manejar el clic.

    3. Agregar una variable de miembro en la RecyclerView Adaptador para sostener a los Débiles de Referencia y un constructor que establece.

    4. Hacer lo mismo en el RecyclerView ViewHolder y agregar una variable miembro para mantener un seguimiento de la posición.

    5. Conjunto de su haga clic en los oyentes en cualquier vista que usted desea en el ViewHolder, luego de devolución de llamada para el respondedor para manejarlos.

    6. Cambiar su onBindViewHolder método para establecer la posición de unión.

    7. Pasar el respondedor abajo a la ViewHolder.

    8. En el respondedor, ahora se puede utilizar getId() en la vista de averiguar qué punto de vista se ha hecho clic.

    Y aquí está la Esencia de modo que usted puede ver cómo encaja todo:
    RecyclerView haga clic en el manejo de

  31. 1

    En kotlin con el constructor de la aplicación

    Inicializar su Recyclerview constructor como el de abajo,

    class ListAdapter(
    c: Context,
    private var list: List<Project>,
    private val itemClick: (Project) -> Unit
    ) : RecyclerView.Adapter<ListAdapter.ViewHolder>() 

    volver con itemClick en su onCreateViewHolder

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):ProjectViewHolder {
    val view = inflater.inflate(R.layout.list_item, parent, false)
    return ViewHolder(view, itemClick)
    }

    Su onBindViewHolder

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.bindProject(list[position])
    }

    A continuación, con viewHolder clase crear bindProject función.

    class ViewHolder(
    view: View,
    private val itemClick: (Project) -> Unit
    ) : RecyclerView.ViewHolder(view) {
    private val clientTextCount = 7
    val titleTextView: TextView = view.projectTitleTextView
    fun bindProject(project: Project) {
    with(project) {
    titleTextView.text = name
    itemView.setOnClickListener { itemClick(this) }
    }
    }
    }

    Finalmente en su actividad inicializar adaptador con perezoso

    private val adapter: ListAdapter by lazy {
    ListAdapter(this, projectList, {
    //Here you can implement your onClick function.
    })
    }

    Para añadir nueva lista para recyclerview inicializar el siguiente método en su adaptador

    fun setProjects(projects: List<Project>) {
    projectList = projects
    notifyDataSetChanged()
    }

    y llame a setProjects método en cualquier parte de su actividad.

    adapter.setProjects(projects)

    Que es.

  32. 0

    Marca de la clase como abstracta y poner en práctica un método OnClick

    public abstract class MainGridAdapter extends
    RecyclerView.Adapter<MainGridAdapter.ViewHolder> {
    private List<MainListItem> mDataset;
    //Provide a reference to the views for each data item
    //Complex data items may need more than one view per item, and
    //you provide access to all the views for a data item in a view holder
    public class ViewHolder extends RecyclerView.ViewHolder {
    //each data item is just a string in this case
    public TextView txtHeader;
    public TextView txtFooter;
    public ViewHolder(View v) {
    super(v);
    txtHeader = (TextView) v.findViewById(R.id.firstLine);
    txtFooter = (TextView) v.findViewById(R.id.secondLine);
    }
    }
    public void add(int position, MainListItem item) {
    mDataset.add(position, item);
    notifyItemInserted(position);
    }
    public void remove(MainListItem item) {
    int position = mDataset.indexOf(item);
    mDataset.remove(position);
    notifyItemRemoved(position);
    }
    //Provide a suitable constructor (depends on the kind of dataset)
    public MainGridAdapter(List<MainListItem> myDataset) {
    mDataset = myDataset;
    }
    //Create new views (invoked by the layout manager)
    @Override
    public MainGridAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
    int viewType) {
    //create a new view
    View v = LayoutInflater.from(parent.getContext()).inflate(
    R.layout.list_item_grid_line, parent, false);
    //set the view's size, margins, paddings and layout parameters
    ViewHolder vh = new ViewHolder(v);
    return vh;
    }
    //Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
    //- get element from your dataset at this position
    //- replace the contents of the view with that element     
    OnClickListener clickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
    onItemClicked(position);
    }
    };
    holder.itemView.setOnClickListener(clickListener);
    holder.txtHeader.setOnClickListener(clickListener);
    holder.txtFooter.setOnClickListener(clickListener);
    final MainListItem item = mDataset.get(position);
    holder.txtHeader.setText(item.getTitle());
    if (TextUtils.isEmpty(item.getDescription())) {
    holder.txtFooter.setVisibility(View.GONE);
    } else {
    holder.txtFooter.setVisibility(View.VISIBLE);
    holder.txtFooter.setText(item.getDescription());
    }
    }
    //Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
    return mDataset.size();
    }
    public abstract void onItemClicked(int position);

    }

    Implementar haga clic en controlador en la unión de los eventos a los que sólo tienen uno de los eventos de aplicación

    Implementación de este:

    mAdapter = new MainGridAdapter(listItems) {         
    @Override
    public void onItemClicked(int position) {
    showToast("Item Clicked: " + position, ToastPlus.STYLE_INFO);
    }
    };

    Mismo puede hacerse larga haga clic en

  33. 0

    Aquí es mi Fragmento de Código

    v.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) 
    {
    int newposition = MainActivity.mRecyclerView.getChildAdapterPosition(v);
    Intent cardViewIntent = new Intent(c, in.itechvalley.cardviewexample.MainActivityCards.class);
    cardViewIntent.putExtra("Position", newposition);
    c.startActivity(cardViewIntent);
    }
    });

    v es Ver de onCreateViewHolder

    c es Contexto

  34. 0

    Aquí es una estrategia que da un resultado similar al de la ListView aplicación en la que puede definir el oyente en el Activity o Fragment nivel en lugar de la Adapter o ViewHolder nivel. También define algunas clases abstractas que cuidar mucho de la repetitivo trabajo de adaptadores y soportes.

    Clases Abstractas

    Primer lugar, definir un resumen Holder que se extiende RecyclerView.ViewHolder y define un tipo de datos genérico, T, utilizado para enlazar datos a las vistas. El bindViews método será aplicado por una subclase para asignar datos a las vistas.

    public abstract class Holder<T> extends RecyclerView.ViewHolder {
    T data;
    public Holder(View itemView) {
    super(itemView);
    }
    public void bindData(T data){
    this.data = data;
    bindViews(data);
    }
    abstract protected void bindViews(T data);
    }

    También, crear un resumen Adapter que se extiende RecyclerView.Adapter<Holder<T>>. Esto define 2 de los 3 métodos de interfaz, y una subclase se necesita para implementar la última, onViewHolderCreated método.

    public abstract class Adapter<T> extends RecyclerView.Adapter<Holder<T>> {
    List<T> list = new ArrayList<>();
    @Override
    public void onBindViewHolder(Holder<T> holder, int position) {
    holder.bindData(list.get(position));
    }
    @Override
    public int getItemCount() {
    return list.size();
    }
    public T getItem(int adapterPosition){
    return list.get(adapterPosition);
    }
    }

    Clases Concretas

    Ahora crear una nueva clase concreta que se extiende Holder. Este método sólo tiene que definir los puntos de vista y de la manija de la unión. Aquí estoy usando la ButterKnife biblioteca, pero siéntase libre de utilizar itemView.findViewById(...) métodos en su lugar.

    public class PersonHolder extends Holder<Person>{
    @Bind(R.id.firstname) TextView firstname;
    @Bind(R.id.lastname) TextView lastname;
    public PersonHolder(View view){
    super(view);
    ButterKnife.bind(this, view);
    }
    @Override
    protected void bindViews(Person person) {
    firstname.setText(person.firstname);
    lastname.setText(person.lastname);
    }
    }

    Finalmente, en su Activity o Fragment de la clase que contiene el RecyclerView usted tendría este código:

    //Create adapter, this happens in parent Activity or Fragment of RecyclerView
    adapter = new Adapter<Person>(){
    @Override
    public PersonHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
    .inflate(R.layout.layout_person_view, parent, false);
    PersonHolder holder = new PersonHolder(v);
    v.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
    int itemPos = holder.getAdapterPosition();
    Person person = getItem(itemPos);
    //do something with person
    EventBus.getDefault().postSticky(new PersonClickedEvent(itemPos, person));
    }
    });
    return holder;
    }
    };
  35. 0

    Muy simple, agregar esta clase:

    public class OnItemClickListener implements View.OnClickListener {
    private int position;
    private OnItemClickCallback onItemClickCallback;
    public OnItemClickListener(int position, OnItemClickCallback onItemClickCallback) {
    this.position = position;
    this.onItemClickCallback = onItemClickCallback;
    }
    @Override
    public void onClick(View view) {
    onItemClickCallback.onItemClicked(view, position);
    }
    public interface OnItemClickCallback {
    void onItemClicked(View view, int position);
    }
    }

    Obtener una instancia de ‘OnItemClickCallback» de la interfaz y la puso en su actividad o fragmento:

    private OnItemClickListener.OnItemClickCallback onItemClickCallback = new OnItemClickListener.OnItemClickCallback() {
    @Override
    public void onItemClicked(View view, int position) {
    }
    };

    A continuación, pasa que de devolución de llamada para su recyclerView:

    recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(Arrays.asList("1", "2", "3"), onItemClickCallback));

    Finalmente, este sería su adaptador:

    public class SimpleStringRecyclerViewAdapter extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> {
    private List<String> mValues;
    private OnItemClickListener.OnItemClickCallback onItemClickCallback;
    public SimpleStringRecyclerViewAdapter(List<String> items, OnItemClickListener.OnItemClickCallback onItemClickCallback) {
    mValues = items;
    this.onItemClickCallback = onItemClickCallback;
    }
    public static class ViewHolder extends RecyclerView.ViewHolder {
    public final TextView mTextView;
    public ViewHolder(View view) {
    super(view);
    mTextView = (TextView) view.findViewById(R.id.txt_title);
    }
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
    return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.mTextView.setText(mValues.get(position));
    holder.mTextView.setOnClickListener(new OnItemClickListener(position, onItemClickCallback));
    }
    @Override
    public int getItemCount() {
    return mValues.size();
    }
    }
  36. 0

    Por lo general, usted tiene más de un elemento en su CardView, de modo que tiene una vista de diseño para envolver y organizarlos.
    Puede agregar un OnClickListener a la vista de maquetación.
    1. Añadir un id a tu disposición. En este caso, un LinearLayout

    <android.support.v7.widget.CardView
    .....>
    <LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/card_view_linearLayout">
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="name"
    android:id="@+id/card_view_name" />
    ...
    </LinearLayout>
    </android.support.v7.widget.CardView>

    $ 2. Obtener la vista de diseño en su interior ViewHolder clase.

    public static class ViewHolder extends RecyclerView.ViewHolder{
    private TextView nameView;
    ...
    private LinearLayout linearLayout;
    public ViewHolder(View itemView) {
    super(itemView);
    nameView = (TextView)itemView.findViewById(R.id.card_view_name);
    ...
    linearLayout = (LinearLayout)itemView.findViewById(R.id.card_view_linearLayout);
    }
    }

    $ 3. Añadir el detector a su diseño en onBindViewHolder y el uso de una devolución de llamada para enviar datos a la Activity o Fragment(no probado).

    @Override
    public void onBindViewHolder(TrackAdapter.ViewHolder holder, final int position) {
    String str = mStringList.get(position);
    holder.nameView.setText(str);
    ...
    holder.linearLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    callback.itemCallback(mStringList.get(position));
    }
    });
    }

    cómo utilizar las devoluciones de llamada es otra historia

  37. 0

    Paso 1 ) Escribir la interfaz de clic

    Crear una interfaz denominada RecyclerViewClickListener.java y añadir a continuación el código. Aquí declaramos dos métodos onClick y onLongClick para identificar el elemento y haga clic en clic largo respectivamente.

    package com.androidtutorialshub.recyclerviewtutorial.Helper;
    import android.view.View;
    public interface RecyclerViewClickListener {
    void onClick(View view, int position);
    void onLongClick(View view, int position);
    }

    Paso 2 ) Escribir el Artículo Toque de Clase

    Crear una clase denominada RecyclerViewTouchListener.java y añadir a continuación el código . Aquí escribimos la lógica para detectar haga clic en y pulsación larga en recycler elemento de vista .

    package com.androidtutorialshub.recyclerviewtutorial.Helper;
    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.View;
    public class RecyclerViewTouchListener implements RecyclerView.OnItemTouchListener{
    private GestureDetector gestureDetector;
    private RecyclerViewClickListener clickListener;
    public RecyclerViewTouchListener(Context context, final RecyclerView recyclerView, final RecyclerViewClickListener clickListener) {
    this.clickListener = clickListener;
    gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
    return true;
    }
    @Override
    public void onLongPress(MotionEvent e) {
    View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
    if (child != null && clickListener != null) {
    clickListener.onLongClick(child, recyclerView.getChildPosition(child));
    }
    }
    });
    }
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    View child = rv.findChildViewUnder(e.getX(), e.getY());
    if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
    clickListener.onClick(child, rv.getChildPosition(child));
    }
    return false;
    }
    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {
    }
    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    }
    }

    Paso 3 ) haga clic en Definir escucha

    Abrir MainActivity.java y actualización de los siguientes cambios. Aquí onClick() método de detectar haga clic sobre el tema y onLongClick detectará largo haga clic sobre el tema.

    recyclerView.addOnItemTouchListener(new RecyclerViewTouchListener(getApplicationContext(), recyclerView, new RecyclerViewClickListener() {
    @Override
    public void onClick(View view, int position) {
    Toast.makeText(getApplicationContext(), bookList.get(position).getTitle() + " is clicked!", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onLongClick(View view, int position) {
    Toast.makeText(getApplicationContext(), bookList.get(position).getTitle() + " is long pressed!", Toast.LENGTH_SHORT).show();
    }
    }));

    Para obtener más información o Descargar el código fuente :- http://www.androidtutorialshub.com/android-recyclerview-click-listener-tutorial/

    • su haga clic en el elemento entero. si tengo un botón más en este para realizar la funcionalidad de este. es también tratar como itemview haga clic en el oyente?
  38. 0

    Misma respuesta en Kotlin

    inner class MyViewHolder(v: View, myOnClickListener: MyOnClickListener) : RecyclerView.ViewHolder(v) {
    init {
    v.setOnClickListener { v -> myOnClickListener.onClick(v, adapterPosition) }
    }
    }
    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
    val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.myview, viewGroup, false)
    return MyViewHolder(view, mOnClickListener)
    }
    inner class MyOnClickListener {
    fun onClick(view: View, position: Int) {
    val item = mList[position]
    Toast.makeText(view.context, item, Toast.LENGTH_LONG).show()
    }
    }
  39. 0

    Probar este, bastante simple. A mí me funciona. Por CIERTO, he encontrado que setOnClickListener no surte efecto para el reciclador de vista.

        recycler.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
    //anything todo
    }
    return true;
    }
    });
  40. 0

    He mirado por todos los contesta y no estaba muy satasifed. Me pareció mucho más fácil y más rápida solución. Quería compartir para los lectores futuros.

    1. Elegir cualquier View en el interior de su único recycler elemento.
    2. Principal de obtener de este View (asegúrese de que usted echa para ambiente ViewGroup )
    3. Conjunto de su onClickListener para esta madre.

    Código de ejemplo (está escrito en el interior de su onBindViewHolder método de su adapter ):

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    ConstraintLayout parent = (ConstraintLayout) holder.title.getParent();
    parent.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Toast.makeText(context, "Clicked recycler view item at position " + position, Toast.LENGTH_SHORT).show();
    }
    });
    }
  41. 0

    Aquí se forma clara y sencilla es añadir en el interior de su ReacyclerView ViewHolder

    public static class MyViewholder extends RecyclerView.ViewHolder {
    public MyViewholder(View itemView) {
    super(itemView);
    itemView.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    Log.d("Tag", "onClick:" + getAdapterPosition());
    }
    });
    }
    }

    getAdapterPosition() se devuelve el actual artículo pulsado posición

  42. 0

    De kotlin manejar haga clic en recyclerview anser basado en Jacobs anser

    kotlin RecyclerViewClick #RecyclerViewClick # Kotlin

    1) CREAR la CLASE RecyclerItemClickListener

    class RecyclerItemClickListener(context: Context, recyclerView: RecyclerView, listner: OnItemClickListener) : RecyclerView.OnItemTouchListener {
    var mGestureDetector: GestureDetector
    var mListner: OnItemClickListener
    interface OnItemClickListener {
    fun onItemClick(view: View, position: Int)
    fun onLongItemClick(view: View, position: Int)
    }
    init {
    this.mListner = listner
    mGestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
    override fun onSingleTapUp(e: MotionEvent?): Boolean {
    return true
    }
    override fun onLongPress(e: MotionEvent?) {
    val child: View? = recyclerView.findChildViewUnder(e!!.getX(), e.getY())
    if (child != null && mListner != null) {
    mListner.onLongItemClick(child, recyclerView.getChildAdapterPosition(child))
    }
    }
    })
    }
    override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {
    }
    override fun onInterceptTouchEvent(view: RecyclerView, e: MotionEvent): Boolean {
    val childView: View? = view.findChildViewUnder(e!!.getX(), e.getY())
    if (childView != null && mListner != null && mGestureDetector.onTouchEvent(e)) {
    mListner.onItemClick(childView, view.getChildAdapterPosition(childView))
    return true
    }
    return false
    }
    override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
    }
    }

    2) obtener haga Clic en Cualquier Recyclerview (actividad/fragmento)

     recyclerView.addOnItemTouchListener(
    RecyclerItemClickListener(
    this, recyclerView, object : RecyclerItemClickListener.OnItemClickListener {
    override fun onItemClick(view: View, position: Int) {
    }
    override fun onLongItemClick(view: View, position: Int) {
    }
    })
    )
  43. 0

    Vamos a ver cómo podemos implementar esto con Jetpack /AndroidX

    Usted necesita para crear un observable en la viewmodel clase como esta

    private MutableLiveData<Integer> adapterItem = new MutableLiveData<>();
    public MutableLiveData<Integer> getAdapterItem() {
    return adapterItem;
    }
    public void setAdapterItem(int adapterItem) {
    this.getAdapterItem().setValue(adapterItem);
    }

    A continuación, en la adaptador de clase asegúrese de que usted pase la perspective de referencia como parámetro en el constructor, a continuación, implementar el clicklistener en el viewholder

        public MyViewHolder(@NonNull View itemView) {
    super(itemView);
    if(itemView != null){
    itemView.setOnClickListener(v -> {
    int adapterPosition = getAdapterPosition();
    viewModel.setAdapterItem(adapterPosition);
    });
    };
    }

    Luego de la actividad clase sólo observar los cambios

        viewModel.getAdapterItem().observe(this, position -> {
    Log.w(TAG, "clicked: " + ridesArray.get(position));
    });

Dejar respuesta

Please enter your comment!
Please enter your name here