¿Por qué no RecyclerView onItemClickListener ()? [Cerrar]

Esta traducción de: ¿Por qué no han RecyclerView tener OnItemClickListener () [Cerrado]?

Cerrada . Cerrado . Esta pregunta se basa en la opinión. Este problema se basa en la opinión. No está aceptando respuestas. No acepta actualmente la respuesta. Más Más información . Más información .

¿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 RecyclerViewy el I se sorprendió al ver que RecyclerViewno disponga de tener onItemClickListener(). Estaba echando un vistazo RecyclerView, me sorprendió encontrar RecyclerViewninguna onItemClickListener(). Debido a que RecyclerViewel se extiende debido a la RecyclerViewexpansión

android.view.ViewGroup android.view.ViewGroup

y ListViewla extiende y ListViewextensiones

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.Adapterescrito onClicka 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, onItemClickListenerha sido problemático. Desde la introducción de ListViewlos años, onItemClickListenerha 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 RecyclerViewlleva 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 RecyclerViewAú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 Recyclerviewno como ListView1: 1 reemplazo sino más bien como un componente más flexible para el uso de casos complejos. No Recyclerviewconsidera ListView1: 1 sustituto, y Recyclerviewconsiderado 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 ListViewy Recyclerview. Ahora, usted tiene un adaptador que se puede delegar a la interfaz onClick pasó en el constructor, que es ListViewy Recyclerviewel 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 onClickListenery 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 onClickListenery 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 ListVieweran una hasta ahora. Es un componente de una necesidad real, y tenemos hasta el momento para la ListViewimplementació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 LayoutManagerclase con RecyclerView por la Administración de su lata que le RecyclerViewgusta- una diferencia es, RecyclerView hay una LayoutManagerclase, puede gestionar a través de esta clase RecyclerView, de la siguiente manera:

Horizontal o Vertical desplazándoseLinearLayoutManager a través de laLinearLayoutManager horizontal de desplazamiento o vertical

GridLayout 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
    }
}

}
Artículos originales publicados 0 · ganado elogios 73 · vistas 550 000 +

Supongo que te gusta

Origin blog.csdn.net/w36680130/article/details/105325532
Recomendado
Clasificación