Estoy tratando de implementar una forma de manejar la selección del elemento en un RecyclerView. Yo personalmente no me gusta la forma en que se sugiere en algunas de las respuestas en MODO de paso a través de gestos, y yo que pensaba que la implementación de un OnClickListener, como se sugiere aquí y aquí, era muchísimo más limpio.

El hecho es que… este patrón no funciona! Yo realmente no soy capaz de entender por qué mi OnClickListener.onClick es nunca llamado. Es un poco como otro método intercepta el ratón antes de onClick puede tomar el cuidado de él.

Este es mi código:

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView tvName;
        ImageView star;

        public ViewHolder(View itemView) {
            super(itemView);

            tvName = (TextView) itemView.findViewById(R.id.CHAT_ITEM_name);
            star = (ImageView) itemView.findViewById(R.id.CHAT_ITEM_star);

            Fonts.setTypeface(tvName, regular);
        }

        @Override
        public void onClick(View view) {
            int position = getLayoutPosition();
            select(position);
        }
    }

Por desgracia, es muy importante para mí, para poder acceder a la posición del ítem pulsado en todo el conjunto de datos, con el fin de eliminarlo, por lo que hacer algo como indexOfChild no es aceptable: he intentado, pero este método le da la posición del elemento en la visibile parte de la lista, haciendo list.remove(position) imposible.

Pero funciona. Puedes publicar todo el código para su ViewHolder para que podamos ver qué es lo que falta?
seguro – acaba de actualizar el código!

OriginalEl autor Gianluca | 2015-07-25

2 Comentarios

  1. 47

    Mirando el código actualizado: no ajuste el onClickListener para cualquiera de las vistas en el ViewHolder. Es un comprensible error olvidar haga clic en el oyente.

    Sólo tiene que utilizar:

    tvName.setOnClickListener(this);
    star.setOnClickListener(this);

    Puede establecer para ambos o sólo uno de ellos. También puede simplemente obtener la matriz de diseño de estos dos puntos de vista, de manera que todo elemento de sí mismo en el adaptador se puede hacer clic.

    itemView.setOnClickListener(this);
    Muchas gracias!!

    OriginalEl autor mobilepotato7

  2. 3

    Usted puede hacer en su onBindViewHolder

             @Override
            public void onBindViewHolder(ReportViewHolder holder, int position {
          holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override 
            public void onClick(View arg0) { 
            //handle your click here. 
        } }); 
    }
    Este método no es el óptimo para el rendimiento.!!! Haga clic en los oyentes más efficiantly de instalación en el constructor de ViewHolder.
    Yo no se usted, usted necesita leer una y otra vez la pregunta, Gianluca está buscando para ser capaz de hacer clic en cada elemento de la RecyclerView de la ViewHolder. vamos a pegar el código sugerencia de que podemos hablar sobre el rendimiento de comparaison.
    El onBindViewHolder() el método es llamado cada vez que un nuevo elemento se muestra en la RecyclerView, así que si usted tiene una lista muy grande que terminan innecesariamente la creación de cientos, o incluso más, haga clic en los oyentes. La creación de los oyentes en la ViewHolder limita el número de oyentes creado a una cantidad razonable. (aproximadamente el número de elementos en la pantalla)
    Estoy de acuerdo, especialmente si el número de elementos es dinámica, no estática.

    OriginalEl autor user2167877

Dejar respuesta

Please enter your comment!
Please enter your name here