Esta traducción de: ¿Por qué no han RecyclerView tener OnItemClickListener () [Cerrado]?
¿Quieres mejorar esta pregunta? ¿Quieres mejorar este problema? Por lo que puede ante la pregunta de actualización pueden responder con citas de carga de los hechos y por Edición del este Mensaje . Problema de actualización, por lo que mediante la edición de esta entrada respuestas en forma de hechos y referencias.
Cerrado 4 meses hace miembro . Hace 4 meses cerrados.
Exploraba el I RecyclerView
y el I se sorprendió al ver que RecyclerView
no disponga de tener onItemClickListener()
. Estaba echando un vistazo RecyclerView
, me sorprendió encontrar RecyclerView
ninguna onItemClickListener()
. Debido a que RecyclerView
el se extiende debido a la RecyclerView
expansión
android.view.ViewGroup android.view.ViewGroup
y ListView
la extiende y ListView
extensiones
android.widget.AbsListView android.widget.AbsListView
. . Mi problema solucionado por la que la escritura Sin embargo onClick
, en mi RecyclerView.Adapter
: Pero pasó el RecyclerView.Adapter
escrito onClick
a resolver mi problema:
public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
public TextView txtViewTitle;
public ImageView imgViewIcon;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
}
@Override
public void onClick(View v) {
}
}
Aún así me gustaría saber el I Pero ¿Por qué Google elimina onItemClickListener()
? Pero todavía quiero saber por qué Google elimina onItemClickListener()
?
¿Hay un problema de rendimiento o alguna otra cosa ? Problemas de rendimiento si o otros problemas?
# 1 planta
: Referencia RecyclerView https://stackoom.com/question/1gPmZ/ Por qué no onItemClickListener- cerrada
Casa # 2
TL; Dr 2016 . RxJava y el Uso una exposición Un PublishSubject a observable en los clics de tl Nian Dr. 2,016 pública RxJava uso y PublishSubject clic objeto observable.
public class ReactiveAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
String[] mDataset = { "Data", "In", "Adapter" };
private final PublishSubject<String> onClickSubject = PublishSubject.create();
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final String element = mDataset[position];
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClickSubject.onNext(element);
}
});
}
public Observable<String> getPositionClicks(){
return onClickSubject.asObservable();
}
}
Post original: post original:
En la Introducción de Operaciones desde ListView
, onItemClickListener
ha sido problemático. Desde la introducción de ListView
los años, onItemClickListener
ha habido un problema. En el momento que tenga un oyente hacer clic para cualquiera de los elementos internos de la devolución de llamada no se pondría en marcha pero no se ha notificado o bien documentado (en su caso) así que no había mucha confusión y SO preguntas sobre el mismo. Cuando se tiene una en el momento de los elementos internos haga clic en el oyente, no dará lugar a la devolución de llamada, pero que no recibió una notificación de devolución de llamada o no debidamente documentada (si lo hay) (So), por lo que hay mucha confusión y duda.
Que ante RecyclerView
lleva más lejos un paso A y no tiene tienen concepto de una fila / columna, sino más bien arbitrariamente dispuestas una cantidad de niños, El delegado Tienen tener el onClick a cada uno de ellos, o al Programador de Aplicación. Dada RecyclerView
Aún más, no es el concepto de diseño de fila / columna, pero ninguna descendencia, por lo que se onClick confiada a cada niño o un programador para implementar.
De de Think Recyclerview
no como ListView
1: 1 reemplazo sino más bien como un componente más flexible para el uso de casos complejos. No Recyclerview
considera ListView
1: 1 sustituto, y Recyclerview
considerado como el montaje flexible, más complejo para casos de uso. Y como usted dice, su solución es lo que Google espera de usted. Como usted ha dicho, su solución es que Google espera de usted. Tienes que tener la OMS un adaptador ahora puede delegar en la interfaz onClick EN UN pasado en el constructor, que está en el patrón correcto para unos y otras ListView
y Recyclerview
. Ahora, usted tiene un adaptador que se puede delegar a la interfaz onClick pasó en el constructor, que es ListView
y Recyclerview
el modo correcto.
public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
public TextView txtViewTitle;
public ImageView imgViewIcon;
public IMyViewHolderClicks mListener;
public ViewHolder(View itemLayoutView, IMyViewHolderClicks listener) {
super(itemLayoutView);
mListener = listener;
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
imgViewIcon.setOnClickListener(this);
itemLayoutView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v instanceof ImageView){
mListener.onTomato((ImageView)v);
} else {
mListener.onPotato(v);
}
}
public static interface IMyViewHolderClicks {
public void onPotato(View caller);
public void onTomato(ImageView callerImage);
}
}
adaptador y luego en su continuación en el adaptador
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
String[] mDataset = { "Data" };
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_layout, parent, false);
MyAdapter.ViewHolder vh = new ViewHolder(v, new MyAdapter.ViewHolder.IMyViewHolderClicks() {
public void onPotato(View caller) { Log.d("VEGETABLES", "Poh-tah-tos"); };
public void onTomato(ImageView callerImage) { Log.d("VEGETABLES", "To-m8-tohs"); }
});
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// Get element from your dataset at this position
// Replace the contents of the view with that element
// Clear the ones that won't be used
holder.txtViewTitle.setText(mDataset[position]);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}
...
Mira en el pasado esa pieza ... Ahora de código: onCreateViewHolder(ViewGroup parent, int viewType)
. Suggest ya está en el Signature Ver Diferentes tipos ahora ven el último trozo de código: onCreateViewHolder(ViewGroup parent, int viewType)
firma ha sugerido a diferentes tipos de vista. Para cada uno de ellos se le requerirá un viewholder diferente también, y, posteriormente, cada uno de ellos puede tener un conjunto diferente de clics. Para cada uno de ellos, que también tendrá una visión diferente del titular, entonces todo el mundo pueden tener un conjunto diferente de clics. PUEDE que el Justo al crear un O la viewholder genérico que el de cualquier View y Toma uno onClickListener
y se aplica en consecuencia y. O bien, puede simplemente crear una visión común del titular, el titular de utilizar cualquier punto de vista y una vista onClickListener
y aplicada en consecuencia. O delegar a un nivel superior al orquestador por lo que varios fragmentos / actividades tienen la misma lista con diferente comportamiento clic. Delegación o de un nivel al coordinador, para que varios segmentos / actividades tienen la misma lista y tienen diferente comportamiento de la pulsación. Una vez más, toda la flexibilidad está de su lado . Además, la flexibilidad son todos de su lado.
Es una de realmente se necesita la TI de componentes y utilizar bastante cerca de la lo que nuestro implementaciones internas y mejoras a ListView
eran una hasta ahora. Es un componente de una necesidad real, y tenemos hasta el momento para la ListView
implementación interna y la mejora es muy estrecha. Bien que finalmente un Google es todo lo reconoce. Google finalmente admitir que es una cosa buena.
Casa # 3
> ¿Cómo es diferente de RecyclerView Listview? > RecyclerView y Listview Cuál es la diferencia?
-Diferencia que lo que hay es una LayoutManager
clase con RecyclerView por la Administración de su lata que le RecyclerView
gusta- una diferencia es, RecyclerView hay una LayoutManager
clase, puede gestionar a través de esta clase RecyclerView
, de la siguiente manera:
Horizontal o Vertical desplazándose
LinearLayoutManager
a través de laLinearLayoutManager
horizontal de desplazamiento o verticalGridLayout por
GridLayoutManager
GridLayout通过GridLayoutManager
Staggered GridLayout por
StaggeredGridLayoutManager
disposición de la rejilla escalonada por laStaggeredGridLayoutManager
Al igual que para el desplazamiento horizontal para RecyclerView- igual por igual horizontal de desplazamiento RecyclerView-
LinearLayoutManager llm = new LinearLayoutManager(context);
llm.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(llm);
# 4 piso
Me gusta este camino y estoy usando que me gusta que sea así, lo estoy usando
Dentro 内
public Adapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
Ponga 放
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_image_and_text, parent, false);
v.setOnClickListener(new MyOnClickListener());
Y crear esto en cualquier clase que desea que y crear tales siempre que sea necesario
class MyOnClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
int itemPosition = recyclerView.indexOfChild(v);
Log.e("Clicked and Position is ",String.valueOf(itemPosition));
}
}
He leído antes de que hay una manera mejor, pero me gusta esta manera se complica fácil y no. He leído antes, hay una manera mejor, pero me gusta este método es simple y sin complicaciones.
Casa # 5
Cómo poner todo juntos ... ejemplo de cómo poner todo junto ... Ejemplo
- la onClick () Manejo de la onClick () Procesamiento
- Cursor - RecyclerView cursor -RecyclerView
Tipos ViewHolder tipo ViewHolder
public class OrderListCursorAdapter extends CursorRecyclerViewAdapter<OrderListCursorAdapter.ViewHolder> { private static final String TAG = OrderListCursorAdapter.class.getSimpleName(); private static final int ID_VIEW_HOLDER_ACTUAL = 0; private static final int ID_VIEW_HOLDER = 1; public OrderListCursorAdapter(Context context, Cursor cursor) { super(context, cursor); } public static class ViewHolderActual extends ViewHolder { private static final String TAG = ViewHolderActual.class.getSimpleName(); protected IViewHolderClick listener; protected Button button; public ViewHolderActual(View v, IViewHolderClick listener) { super(v, listener); this.listener = listener; button = (Button) v.findViewById(R.id.orderList_item_button); button.setOnClickListener(this); } public void initFromData(OrderData data) { Log.d(TAG, "><initFromData(data=" + data + ")"); orderId = data.getId(); vAddressStart.setText(data.getAddressStart()); vAddressEnd.setText(data.getAddressEnd()); } @Override public void onClick(View view) { if (view instanceof Button) { listener.onButtonClick((Button) view, getPosition(), this); } else { super.onClick(view); } } public interface IViewHolderClick extends ViewHolder.IViewHolderClick { public void onButtonClick(Button button, int position, ViewHolder viewHolder); } } public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private static final String TAG = ViewHolder.class.getSimpleName(); protected long orderId; protected IViewHolderClick listener; protected TextView vAddressStart; protected TextView vAddressEnd; protected TextView vStatus; public ViewHolder(View v, IViewHolderClick listener) { super(v); this.listener = listener; v.setOnClickListener(this); vAddressStart = (TextView) v.findViewById(R.id.addressStart); vAddressEnd = (TextView) v.findViewById(R.id.addressEnd); vStatus = (TextView) v.findViewById(R.id.status); } public void initFromData(OrderData data) { Log.d(TAG, "><initFromData(data=" + data + ")"); orderId = data.getId(); vAddressStart.setText(data.getAddressStart()); vAddressEnd.setText(data.getAddressEnd()); } public long getOrderId() { return orderId; } @Override public void onClick(View view) { listener.onCardClick(view, getPosition(), this); } public interface IViewHolderClick { public void onCardClick(View view, int position, ViewHolder viewHolder); } } @Override public int getItemViewType(int position) { return position == 0 ? ID_VIEW_HOLDER_ACTUAL : ID_VIEW_HOLDER; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Log.d(TAG, ">>onCreateViewHolder(parent=" + parent + ", viewType=" + viewType + ")"); ViewHolder result; switch (viewType) { case ID_VIEW_HOLDER_ACTUAL: { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout_actual, parent, false); result = new ViewHolderActual(itemView, new ViewHolderActual.IViewHolderClick() { @Override public void onCardClick(View view, int position, ViewHolder viewHolder) { Log.d(TAG, "><onCardClick(view=" + view + ", position=" + position + ", viewHolder=" + viewHolder + ")"); Intent intent = new Intent(view.getContext(), OrderDetailActivity.class); intent.putExtra(OrderDetailActivity.ARG_ORDER_ID, viewHolder.getOrderId()); view.getContext().startActivity(intent); } @Override public void onButtonClick(Button button, int position, ViewHolder viewHolder) { Log.d(TAG, "><onButtonClick(button=" + button + ", position=" + position + ", viewHolder=" + viewHolder + ")"); Intent intent = new Intent(button.getContext(), OrderMapActivity.class); intent.putExtra(OrderMapActivity.ARG_ORDER_ID, viewHolder.getOrderId()); button.getContext().startActivity(intent); } }); break; } case ID_VIEW_HOLDER: default: { View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout, parent, false); result = new ViewHolder(itemView, new ViewHolder.IViewHolderClick() { @Override public void onCardClick(View view, int position, ViewHolder viewHolder) { Log.d(TAG, "><onCardClick(view=" + view + ", position=" + position + ", viewHolder=" + viewHolder + ")"); Intent intent = new Intent(view.getContext(), OrderDetailActivity.class); intent.putExtra(OrderDetailActivity.ARG_ORDER_ID, viewHolder.getOrderId()); view.getContext().startActivity(intent); } }); break; } } Log.d(TAG, "<<onCreateViewHolder(parent=" + parent + ", viewType=" + viewType + ")= " + result); return result; } @Override public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) { Log.d(TAG, "><onBindViewHolder(viewHolder=" + viewHolder + ", cursor=" + cursor + ")"); final OrderData orderData = new OrderData(cursor); viewHolder.initFromData(orderData); } }
Casa # 6
Gracias a @marmor, he actualizado mi respuesta . Gracias @marmor, he actualizado la respuesta.
El pienso que APOS una buena solución para manejar el onClick () en el ViewHolder constructor de la clase y pasarlo a la clase padre Via OnItemClickListener interfaz. Creo que esto es ViewHolder proceso constructor de la clase onClick () y por OnItemClickListener transmitido a la interfaz la clase principal forma en que una buena .
MyAdapter.java MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private LayoutInflater layoutInflater;
private List<MyObject> items;
private AdapterView.OnItemClickListener onItemClickListener;
public MyAdapter(Context context, AdapterView.OnItemClickListener onItemClickListener, List<MyObject> items) {
layoutInflater = LayoutInflater.from(context);
this.items = items;
this.onItemClickListener = onItemClickListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.my_row_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
MyObject item = items.get(position);
}
public MyObject getItem(int position) {
return items.get(position);
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView title;
private ImageView avatar;
public ViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
avatar = itemView.findViewById(R.id.avatar);
title.setOnClickListener(this);
avatar.setOnClickListener(this);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
//passing the clicked position to the parent class
onItemClickListener.onItemClick(null, view, getAdapterPosition(), view.getId());
}
}
}
El uso del adaptador en otras clases: el adaptador en otro tipo de uso clases:
MyFragment.java MyFragment.java
public class MyFragment extends Fragment implements AdapterView.OnItemClickListener {
private RecyclerView recycleview;
private MyAdapter adapter;
.
.
.
private void init(Context context) {
//passing this fragment as OnItemClickListener to the adapter
adapter = new MyAdapter(context, this, items);
recycleview.setAdapter(adapter);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//you can get the clicked item from the adapter using its position
MyObject item = adapter.getItem(position);
//you can also find out which view was clicked
switch (view.getId()) {
case R.id.title:
//title view was clicked
break;
case R.id.avatar:
//avatar view was clicked
break;
default:
//the whole row was clicked
}
}
}