Estoy trabajando con RecyclerView y CardView. Quiero adjuntar OnClickListner a cada tarjeta. He probado con muchas respuestas disponibles en stackoverflow, pero ellos no son los que trabajan para mí. Hasta ahora he intentado –

public class SubjectAdapter extends RecyclerView.Adapter<SubjectAdapter.ViewHolder> implements View.OnClickListener,
View.OnLongClickListener{
private static final String LOGCAT = "SubjectAdapter";
private final Context mContext;
List<Subject> SubjectsList;
public SubjectAdapter(Context context) {
super();
this.mContext = context;
SQLiteDatabase.loadLibs(mContext);
DBHelper myDbHelper = new DBHelper(mContext);
SubjectsList = new ArrayList<Subject>();
SubjectsList = myDbHelper.getAllSubjects();
myDbHelper.close();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.subject_cardview_row, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(v);
//Below two lines are NOT working
viewHolder.tvSubjectName.setOnClickListener(this);
//viewHolder.setOnClickListener(this);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
Subject subject = SubjectsList.get(i);
viewHolder.tvSubjectName.setText(subject.getSubject_Name());
viewHolder.tvCounts.setText(String.valueOf(subject.getSubject_Number_of_Questions()));
//Below two lines are NOT working
viewHolder.tvSubjectName.setOnClickListener(this);
//viewHolder.setOnClickListener(this);
}
@Override
public int getItemCount() {
return SubjectsList.size();
}
@Override
public void onClick(View v) {
//It's not working either
ViewHolder holder = (ViewHolder) v.getTag();
int position = holder.getPosition();
if (v.getId() == holder.tvSubjectName.getId()){
Log.d(LOGCAT, "tvSubjectName onClick at" + position);
//Toast.makeText(mContext, "tvSubjectName onClick at" + position, Toast.LENGTH_LONG).show();
} else {
Log.d(LOGCAT, "RecyclerView Item onClick at " + position);
//Toast.makeText(mContext, "RecyclerView Item onClick at " + position, Toast.LENGTH_LONG).show();
}
}
@Override
public boolean onLongClick(View v) {
return false;
}
class ViewHolder extends RecyclerView.ViewHolder {
public TextView tvSubjectName;
public TextView tvCounts;
public ViewHolder(View itemView) {
super(itemView);
tvSubjectName = (TextView) itemView.findViewById(R.id.tv_subject_name);
tvCounts = (TextView) itemView.findViewById(R.id.tv_text_counts);
}
}
}

Como se puede ver, he intentado setOnClickListener con tanto onCreateViewHolder y onBindViewHolder, también por separado como onClick, pero ninguno de ellos parece estar funcionando para mí. Así que, quiero saber, Cómo agregar OnClickListner a CardView?

puede proporcionar su fichero XML de diseño ?

OriginalEl autor Dr. Atul Tiwari | 2015-05-09

5 Comentarios

  1. 9

    Vista devuelto por onClick no necesariamente corresponden a la fila en la Vista de jerarquía de la reciclador de vista.
    Creo que se debe modificar onBindViewHolder con

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
    final Subject subject = SubjectsList.get(i); 
    viewHolder.tvSubjectName.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
    Log.d(LOGCAT, "tvSubjectName onClick at" + i);
    //etc
    }
    });
    ...
    }

    Si el uso a largo, a continuación, haga clic en reemplazar View.OnClickListener con View.OnLongClickListener y onClick con onLongClick.

    hola, funciona para el OnClickListener, pero mostrando el error para OnLongClickListener. También creo que significaba View.OnClickListener, en el código de ejemplo. Voy a marcar mejor respuesta, tan pronto como puedo conseguir que funcione para OnLongClickListener demasiado. gracias. upvote de mí.
    2. también, es de todos modos por que algo como esto se puede lograr – viewHolder.setOnClickListener ?
    Yo lo tengo ahora, mezclados onClickLinstner (que requiere setOnClickListener) y onLongClickListner.(lo que requiere setOnLongClickListener). Su sugerencia obras después de estas correcciones. Amablemente corregirlos. Pero yo no podía encontrar una manera de conseguir directamente viewHolder.setOnClickListener, otros que el uso de onClickListner a todo el diseño. Gracias.
    Wah, editado al mismo tiempo, mientras yo estaba mencionando el mismo en los comentarios. 😛
    Bien, gracias. Para responder a tu#2 sí se puede. Si usted tiene el id de la raíz de su fila R.layout.subject_cardview_row que supongo que es CardView, a continuación, puede obtener la referencia en ViewHolder la misma forma que lo hizo TextView tvSubjectName, tvCounts. Entonces usted puede conectar un clic en el oyente.

    OriginalEl autor inmyth

  2. 4

    Esto funcionó para mí !
    Poner el setOnClickListener-método dentro del constructor de su ViewHolder clase.

    class ViewHolder extends RecyclerView.ViewHolder
    {
    public TextView tvSubjectName;
    public TextView tvCounts;
    public ViewHolder(View itemView) 
    {
    super(itemView);
    tvSubjectName = (TextView) itemView.findViewById(R.id.tv_subject_name);
    tvCounts = (TextView) itemView.findViewById(R.id.tv_text_counts);
    itemView.setOnClickListener(new View.OnClickListener()
    {
    @Override
    public void onClick(View v)
    {
    //write here the code for wathever you want to do with a card
    //...
    }
    });
    }

    }

    funciona, pero creo que fue recibiendo el error cada vez que yo estaba tratando de obtener la posición ViewHolder holder = (ViewHolder) v.getTag(); int position = holder.getPosition(); también incluso si de alguna manera podría conseguir la posición, no me extra info, que soy capaz de conseguir de @inmyth la respuesta (int i, en su respuesta). Upvote de mí.
    ok, lo tengo. Voy a probar con el entero, pero aun así, yo No sería capaz de obtener información adicional, como subject.getSubject_Name() que está en onBindViewHolder o hay alguna forma de evitar?
    Trate de usar v. findViewById() dentro de la onClick y utilizar el TextView obtener la información adicional que desee. Creo que hay mejores maneras de obtener la información adicional, pero este es uno que usted puede intentar.
    Hola, gracias por su continuo apoyo, pero tengo todo lo que necesitaba, desde la modificación de @inmyth la respuesta (estoy comentando lo del error en su respuesta). Ojalá pudiera doble voto por su ayuda 🙂
    El método de @inmyth utiliza es el mismo que yo, el código sólo se encuentra en un lugar diferente.

    OriginalEl autor Nike Sprite

  3. 1

    Retirar Lucas Rocha nuevo TwoWayView de la API.

    TwoWayLayoutManager es una API simple en la parte superior de LayoutManager que hace todo el laborioso trabajo para usted de modo que usted pueda centrarse en cómo el niño vistas son medidos, colocado, y separada de la RecyclerView.

    Siga su sitio y la implementación de la API es relativamente simple y puede ayudar a usted a través de algunos de los difíciles complejidades RecyclerView y CardView pose.

    http://lucasr.org/2014/07/31/the-new-twowayview/

    gracias, parece agradable.. se prueba en mi tiempo libre

    OriginalEl autor AlleyOOP

  4. 0

    Conjunto OnClickListener para itemView en RecyclerView.ViewHolder constructor, también se puede obtener la posición de cardView utilizando getAdapterPosition() método que puede ayudar a pasar los datos a la nueva actividad utilizando el método putExtra de intención. doc para getAdapterPosition método

    `

    class ViewHolder extends RecyclerView.ViewHolder
    {
    public TextView tvSubjectName;
    public TextView tvCounts;
    public ViewHolder(View itemView) 
    {
    super(itemView);
    tvSubjectName = (TextView) itemView.findViewById(R.id.tv_subject_name);
    tvCounts = (TextView) itemView.findViewById(R.id.tv_text_counts);
    itemView.setOnClickListener(new View.OnClickListener()
    {
    @Override
    public void onClick(View v)
    {
    int position = getAdapterPosition();
    //use position to put extra data
    }
    });
    }

    `

    OriginalEl autor Nagesh Dhope

  5. 0

    Si usted realmente desea implementar onclick oyente, a continuación, haga lo siguiente

    1. agregar un objeto de la Vista en su ViewHolderClass y la inicializamos con el itemView recibido en el constructor

    2.setOnClickListener a la vista del objeto que se ha declarado(en ViewHolder) onBindViewHolder en el Adaptador de la clase

    esto va a funcionar para todo el cardView

    OriginalEl autor Sanga Krish

Dejar respuesta

Please enter your comment!
Please enter your name here