OnClickListener en RecyclerView.ViewHolder
Tengo un RecyclerView.ViewHolder y RecyclerView.Adapter, necesito después de hacer clic en el elemento y luego enviar información acerca de este elemento a otra Activity
.
PlacesAdapter.java
- Android java porcentaje bitmap píxel diferencia entre dos imágenes
- Recorte de visualización de Android
- Cómo crear AsyncTasks reutilizables en android?
- Android Google Play Service Visión Explorador de códigos de barras Biblioteca no encontrada
- Android @NonNull utilidad
public class PlacesAdapter extends RecyclerView.Adapter<PlacesViewHolder> { private PlacesActivity placesActivity; Context context; private int position; List<Places> places; public PlacesAdapter(List<Places> places) { this.places = places;} @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); } @Override public PlacesViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.places_view, viewGroup, false); PlacesViewHolder pvh = new PlacesViewHolder(v); return pvh; } @Override public void onBindViewHolder(PlacesViewHolder personViewHolder, int i) { personViewHolder.name.setText(places.get(i).name); personViewHolder.address.setText(places.get(i).address); Picasso.with(personViewHolder.itemView.getContext()) .load(places.get(i).photo) .into(personViewHolder.getPhoto()); } @Override public int getItemCount() { return places.size(); } }
PlacesViewHolder.java
En esta línea "intent.putExtra(PlacesDetail.PLACES_NAME,);"
¿Cómo puedo enviar mi nombre?
public class PlacesViewHolder extends RecyclerView.ViewHolder { CardView cv; public TextView name; public TextView address; public ImageView photo; public PlacesViewHolder(final View itemView) { super(itemView); cv = (CardView)itemView.findViewById(R.id.cv); name = (TextView)itemView.findViewById(R.id.person_name); address = (TextView)itemView.findViewById(R.id.person_age); photo = (ImageView)itemView.findViewById(R.id.person_photo); itemView.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Context context = v.getContext(); Intent intent = new Intent(context, PlacesDetail.class); intent.putExtra(PlacesDetail.PLACES_NAME,); context.startActivity(intent); } }); } public TextView getAddress() { return address; } public TextView getName() { return name; } public ImageView getPhoto() { return photo; } }
- ¿Cómo puedo obtener el nombre del paquete del lanzador actual en android 2.3 y superior?
- Android OpenCV Mejora de la calidad de detección
- Android ClassCastException con el tipo en blanco
- JSONArray no funciona cuando recibo la cadena JSON del servidor
- Cómo deslizar una vista dentro y fuera de android
- Cambiar la actividad con Swipe
- ¿Cuál es la mejor manera de aplicar una máscara a un EditText en Android?
- Deshabilitar haga clic en RecyclerView dentro de un SwipeRefreshLayout
Este es el ejemplo completo de Adaptador personalizado donde puedo obtener los detalles de determinados elementos. En MainActivity necesitas configurar el adaptador:
adapter = new MyAdapter(getApplicationContext(), account_no, title, aFN1, aLN1,aFN2, aLN2,aFN3, aLN3,isavilable,waitlist,flag); adapter.notifyDataSetChanged(); mRecyclerView.setAdapter(adapter);
Ahora vea el código para el adaptador personalizado:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { String TAG = "MyAdapter"; Context context; private String[] accountNo; private String[] title; private String[] afn1; private String[] aln1; private String[] afn2; private String[] aln2; private String[] afn3; private String[] aln3; private String[] isAvailable; private String[] waitlist; private int flag; public static class ViewHolder extends RecyclerView.ViewHolder { public TextView account_no,title,afn1,afn2,aln1,aln2,color,is_available; private ImageView img_android; CardView cardView; public ViewHolder(CardView v) { super(v); account_no = (TextView)v.findViewById(R.id.acctno); title = (TextView)v.findViewById(R.id.title); afn1 = (TextView) v.findViewById(R.id.afn1); cardView = v; } } // Provide a suitable constructor (depends on the kind of dataset) public MyAdapter(Context context, String[] accountNo,String[] title,String[] afn1,String[] aln1,String[] afn2,String[] aln2,String[] afn3,String[] aln3,String[] isAvailable, String[] waitlist,int flag) { this.context = context; this.accountNo = accountNo; this.title = title; this.afn1 = afn1; this.aln1 = aln1; this.afn2 = afn2; this.aln2 = aln2; this.afn3 = afn3; this.aln3 = aln3; this.isAvailable = isAvailable; this.waitlist = waitlist; this.flag = flag; Log.d(TAG,afn1.toString() +aln1+afn2+aln2+afn3+aln3.toString()+waitlist); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); return new ViewHolder(cv); } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { final CardView cardView = holder.cardView; final TextView accountno = (TextView)cardView.findViewById(R.id.acctno); accountno.setText(accountNo[position]); final TextView titletxt = (TextView)cardView.findViewById(R.id.title); titletxt.setText(title[position]); final TextView afn1txt = (TextView) cardView.findViewById(R.id.afn1); afn1txt.setText(afn1[position]+" "+aln1[position]); Log.d(TAG,waitlist[position]); cardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int id = getItemViewType(position); SharedPreferences sharedPreferences = context.getSharedPreferences(Constant.MYPREFERENCE,Context.MODE_PRIVATE); SharedPreferences.Editor edit = sharedPreferences.edit(); edit.putString(Constant.ACCOUNT,accountNo[position]); edit.putString(Constant.TITLE,title[position]); edit.putString(Constant.AFN1,afn1[position]); edit.putString(Constant.ALN1,aln1[position]); edit.putString(Constant.AFN2,afn2[position]); edit.putString(Constant.ALN2,aln2[position]); edit.putString(Constant.AFN3,afn3[position]); edit.putString(Constant.ALN3,aln3[position]); edit.putBoolean(Constant.IS_AVAILABLE, Boolean.parseBoolean(isAvailable[position].toUpperCase())); edit.putString(Constant.WAITLIST,waitlist[position]); Log.d("WaitingNo2 :",""+String.valueOf(waitlist[position])); edit.commit(); Intent intent = new Intent(v.getContext(), DetailsActivity.class); v.getContext().startActivity(intent); } }); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return accountNo.length; } }
Después de todo lo que obtiene el valor de sharedPreferences en la actividad que se llama Card Click:
preferences = getSharedPreferences("myshared", Context.MODE_PRIVATE); AccountNo = sharedPreferences.getString(Constant.ACCOUNT,null).toUpperCase(); title = sharedPreferences.getString(Constant.TITLE,null).toUpperCase(); afn1 = sharedPreferences.getString(Constant.AFN1,null).toUpperCase(); aln1 = sharedPreferences.getString(Constant.ALN1,null).toUpperCase(); afn2 = sharedPreferences.getString(Constant.AFN2,null).toUpperCase(); aln2 = sharedPreferences.getString(Constant.ALN2,null).toUpperCase(); afn3 = sharedPreferences.getString(Constant.AFN3,null).toUpperCase(); aln3 = sharedPreferences.getString(Constant.ALN3,null).toUpperCase(); isAvailable = sharedPreferences.getBoolean(Constant.IS_AVAILABLE,isAvailable); waitlist = sharedPreferences.getString(Constant.WAITLIST,waitlist);
Ahora haz lo que quieras y disfruta del código.
Puede lograr esto creando una interfaz dentro de su adaptador para un itemclicklistener
y luego puede establecer onItemClickListener
desde PlacesActivity
.
En algún lugar dentro de su PlacesAdapter
necesitaría lo siguiente:
private onRecyclerViewItemClickListener mItemClickListener; public void setOnItemClickListener(onRecyclerViewItemClickListener mItemClickListener) { this.mItemClickListener = mItemClickListener; } public interface onRecyclerViewItemClickListener { void onItemClickListener(View view, int position, String places_name); }
Entonces dentro de su ViewHolder
(que he agregado como una clase interna dentro de mi adaptador), usted aplicaría el listener a los componentes que usted quisiera que el usuario hiciera clic, así:
class PlacesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { PlacesViewHolder(View view) { super(view); view.setOnClickListener(this); } @Override public void onClick(View v) { if (mItemClickListener != null) { mItemClickListener.onItemClickListener(v, getAdapterPosition(), PlacesDetail.PLACES_NAME); } } }
Este ejemplo muestra un onClickListener
se aplica a la vista dentro de PlacesViewHolder
.
recyclerView.setAdapter(adapter);// set adapter on recyclerview adapter.notifyDataSetChanged();// Notify the adapter adapter.setOnItemClickListener(new PlacesAdapter.onRecyclerViewItemClickListener() { @Override public void onItemClickListener(View view, int position, String places_name) { //perform click logic here (places_name is passed) } });
Para implementar este código, debería setOnItemClickListener
en su adaptador dentro de PlacesActivity
como se muestra arriba.
Prueba esto, es trabajo conmigo correctamente
Crear una nueva clase y este código
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){} }
Y en su Actividad añada esto a la implementación de su adaptador
mRecyclerView.addOnItemTouchListener( new RecyclerItemClickListener(getActivity(), mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { // do something } } } @Override public void onLongItemClick(View view, int position) { // do whatever } }) );
- Comenzando en una nueva línea en el emulador (proyecto Android Eclipse)
- Cómo tomar una captura de pantalla dentro de mi aplicación Android