studio recyclerview example ejemplo cardview android android-recyclerview android-cardview

android - example - Problema con CardView y OnClickListener en RecyclerView



recyclerview android example (5)

Estoy usando el diseño de CardView como Fila para RecyclerView. Sin embargo, tengo problemas para adjuntar OnClickListener al diseño. Estoy usando el siguiente diseño

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="@dimen/unit_5" android:clickable="true" android:longClickable="true" card_view:cardCornerRadius="@dimen/unit_5"> <LinearLayout android:layout_width="match_parent" android:layout_height="@dimen/spinnerWidth" android:background="@drawable/row_item_background" android:clickable="true" android:orientation="vertical" android:padding="@dimen/dialog_left_padding"> <!-- Other items --> </LinearLayout> </android.support.v7.widget.CardView>

Los siguientes son mi adaptador y ViewHolder

private class SampleAdapter extends RecyclerView.Adapter<SampleViewHolder> { ArrayList<Item> arrayList; private LayoutInflater inflater; public SampleAdapter(Context context) { inflater = LayoutInflater.from(context); this.arrayList = new ArrayList<>(); arrayList.addAll(items); } @Override public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.layout1, parent, false); SampleViewHolder holder = new SampleViewHolder(view); holder.setClickHandler(handler); return holder; } @Override public void onBindViewHolder(SampleViewHolder holder, int position) { } @Override public int getItemCount() { return arrayList.size(); } } static class SampleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { TextView name; IClickHandler clickHandler; public IClickHandler getClickHandler() { return clickHandler; } public void setClickHandler(IClickHandler clickHandler) { this.clickHandler = clickHandler; } public SampleViewHolder(View itemView) { super(itemView); name = (TextView) itemView .findViewById(R.id.name); itemView.setOnClickListener(this); itemView.setOnLongClickListener(this); } @Override public void onClick(View view) { if (getClickHandler() != null) { getClickHandler().onItemClicked(view, getLayoutPosition()); } } @Override public boolean onLongClick(View view) { if (getClickHandler() != null) { getClickHandler().onItemLongClicked(view, getLayoutPosition()); } return true; } }

Pero este onClick nunca se dispara.

Sin embargo, si reemplazo CardView con LinearLayout, todo funciona bien. No estoy seguro de cuál es el problema aquí. ¿Alguien puede ayudarme en esto?

Gracias.


El problema estaba en la forma en que se configuró el diseño para la fila. Hice un diseño lineal como el elemento superior y, por lo tanto, la vista de tarjeta como hija y todo comenzó a funcionar.


En realidad, la implementación de OnClick es muy sencilla y no estoy seguro de la implementación de un controlador de clics personalizado (IClickHandler).

En primer lugar, el titular de la vista debe ser justo:

static class SampleViewHolder extends RecyclerView.ViewHolder { TextView name; public SampleViewHolder(View itemView) { super(itemView); name = (TextView) itemView.findViewById(R.id.name); } }

Y luego en SampleAdapter

@Override public SampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.layout1, parent, false); SampleViewHolder holder = new SampleViewHolder(view); return holder; } @Override public void onBindViewHolder(SampleViewHolder holder, int position) { final Item item = arrayList.get(position); holder.name.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { //notice I implemented onClickListener here // so I can associate this click with final Item item } }); }


Enfrenté un problema similar. Parece que OnClick no funcionaba. El problema era que la vista raíz de mi diseño era Distribución relativa ... Así que cambié eso a la vista de tarjeta (y agregué el diseño relativo dentro) y funcionó bien.


Mi tarjeta recyclerView inside no respondió cuando hice clic,
El problema era que la Etiqueta principal de mi CardView era ScrollView. En otras palabras, mi row_layout, es decir, CardView, estaba dentro de ScrollView. Así que eliminé ScrollView, funciona.


Solución genérica perfecta

** Paso 1: ** Ve a xml donde está colocada la vista de tarjeta. Asigna una identificación

<android.support.v7.widget.CardView android:id="@+id/cardView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/activity_vertical_margin" app:cardCornerRadius="@dimen/activity_vertical_margin" app:cardElevation="@dimen/activity_vertical_margin" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"/>

** Paso 2: ** Clase de poseedor de Vista interna: obtener la ID de la vista de tarjeta

La clase pública View_Holder_For_Grocery amplía RecyclerView.ViewHolder {CardView cv;

View_Holder_For_Grocery(View itemView) { super(itemView); cv = (CardView) itemView.findViewById(R.id.cardView); }

}

** Paso 3: ** Dentro de la clase Recycler_View_Adapter el método onBindViewHolder el onClick es el siguiente

@Override public void onBindViewHolder(View_Holder_For_Grocery holder, final int position) { holder.cv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switch (position){ case 0: Intent intent0=new Intent(v.getContext(),SunrayActivity.class); v.getContext().startActivity(intent0); break; case 1: Intent intent1=new Intent(v.getContext(),SunfeastActivity.class); v.getContext().startActivity(intent1); break; case 2: Intent intent2=new Intent(v.getContext(),SunriseActivity.class); v.getContext().startActivity(intent2); break; } } }); }