Por que não ter RecyclerView onItemClickListener () ? Como RecyclerView e é diferente do Listview ?

? Tarun Varshney @ | Original: StackOverFlow
---

Eu não sei se estou fazendo a pergunta certa . Eu estava explorando RecyclerView e fiquei surpreso ao ver que RecyclerView não tem onItemClickListener() . Porque RecyclerView estende-se

android.view.ViewGroup

e ListView estende-se

android.widget.AbsListView

. No entanto, eu resolvi meu problema por escrito onClick na minha RecyclerView.Adapter :

  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) {
        // TODO Auto-generated method stub

    }
}

Mas eu ainda quero saber por que o Google removeu onItemClickListener() ?

Existe um problema de desempenho ou algo mais?

---

Top 5 Responder

1MLProgrammer-CiM @

Desde a introdução de ListView, onItemClickListener tem sido problemático . No momento em que você tem um ouvinte clique para qualquer um dos elementos internos do callback não seria acionado, mas não foi notificado ou bem documentada ( quando muito) por isso houve muita confusão e SO perguntas sobre o assunto .

Tendo em conta que RecyclerView leva um passo mais longe e não tem um conceito de uma linha / coluna, mas sim uma quantidade arbitrariamente colocado para fora das crianças, tenham delegado a onClick para cada um deles, ou ao programador implementação.

Pense em Recyclerview não como um ListView 1: 1 substituição, mas sim como um componente mais flexível para os casos de uso complexos. E como você diz, sua solução é o que o Google espera de você . Agora você tem um adaptador que pode delegar onClick para uma interface repassado o construtor, que é o padrão correto para ambos ListView e Recyclerview .

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);
    // Is this needed or handled automatically by RecyclerView.ViewHolder?
    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);
}

}

e, em seguida, no seu 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("Poh-tah-tos"); };
           public void onTomato(ImageView callerImage) { Log.d("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;
    } 

  ...

Agora olhar para a última parte do código : onCreateViewHolder(ViewGroup parent, int viewType) a assinatura já sugerem diferentes tipos de vista . Para cada um deles você vai exigir um viewholder diferente também, e, posteriormente, cada um deles pode ter um conjunto diferente de cliques. Ou você pode simplesmente criar um viewholder genérico que leva qualquer ponto de vista e um OnClickListener e aplica-se em conformidade. Ou delegar -se um nível para o orquestrador assim vários fragmentos / atividades têm a mesma lista com o comportamento do botão diferente. Mais uma vez, toda a flexibilidade está do seu lado .

É um componente realmente necessário e relativamente próximo ao que os nossos implementações internas e melhorias para ListView foram até agora. É bom que o Google finalmente reconhece -lo.

2Tarun Varshney @

> Como RecyclerView é diferente do Listview ?

Uma diferença é que não há LayoutManager class com RecyclerView pelo qual você pode gerenciar o seu RecyclerView como-

Horizontal ou Vertical rolagem LinearLayoutManager

GridLayout por GridLayoutManager

Escalonada GridLayout por StaggeredGridLayoutManager

Como por rolagem horizontal para RecyclerView-

  LinearLayoutManager llm = new LinearLayoutManager(context);
    llm.setOrientation(LinearLayoutManager.HORIZONTAL);
    recyclerView.setLayoutManager(llm);
3Amir Fazwan @
itemLayoutView.setOnClickListener(new View.setOnClickListener() {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(v.getContext(), "on item click", Toast.LENGTH_SHORT).show();

                return true;
            }
        });

Implementar este construtor ViewHolder dentro.