android - eventos - ¿Cómo agregar OnClickListner a CardView?
recyclerview onclick get position (5)
Estoy trabajando con RecyclerView
y CardView
. Quiero adjuntar OnClickListner
a cada tarjeta. Intenté con muchas respuestas disponibles en stackoverflow, pero no funcionan para mí. Hasta ahora lo 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, probé setOnClickListener
con onCreateViewHolder
y onBindViewHolder
, también como onClick
separado, pero ninguno de ellos parece funcionar para mí. Entonces, quiero saber, ¿cómo agregar OnClickListner a CardView?
Establezca OnClickListener en itemView en el constructor RecyclerView.ViewHolder, también puede obtener la posición de cardView usando el método getAdapterPosition()
que puede ayudarlo a pasar los datos a la nueva actividad mediante el método de intención putExtra. doc para el método getAdapterPosition
`
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
}
});
}
`
¡Esto funcionó para mí! Coloque el método setOnClickListener dentro del constructor de su clase ViewHolder.
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
//...
}
});
}
}
La vista devuelta por onClick no se corresponde necesariamente con la jerarquía de filas Ver de la vista de reciclador. Creo que deberías 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 usa un clic largo, reemplace View.OnClickListener
con View.OnLongClickListener
y haga clic en onLongClick
.
Mira la nueva API TwoWayView de Lucas Rocha.
TwoWayLayoutManager es una API simple en la parte superior de LayoutManager que hace todo el trabajo laborioso para que usted pueda enfocarse en cómo se miden, colocan y separan las vistas secundarias de RecyclerView.
Siga su sitio y la implementación de la API es relativamente simple y podría ayudarlo a superar algunas de las complejidades difíciles que plantean RecyclerView y CardView.
Si realmente desea implementar escucha onclick, haga lo siguiente
- agregue un objeto View en su ViewHolderClass e inícielo en el elementoView recibido en el constructor
2.setOnClickListener al objeto de vista que ha declarado (en ViewHolder) onBindViewHolder en la clase Adapter
esto funcionará para toda la tarjeta