Почему не RecyclerView есть onItemClickListener () ? и как RecyclerView отличается от ListView ?

? Tarun Varshney @ | Original: StackOverFlow
---

Я не знаю, ли я просить правильный вопрос . Я исследовал RecyclerView, и я был удивлен тем, что RecyclerView не имеет onItemClickListener() . Потому что RecyclerView распространяется

android.view.ViewGroup

и ListView распространяется

android.widget.AbsListView

, Однако я решил мою проблему, написав onClick В моей 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

    }
}

Но все-таки я хочу знать, почему Google удалить onItemClickListener() ?

Естьпроблема с производительностью или что-то еще?

---

Top 5 ответ

1MLProgrammer-CiM @

С момента введения ListView, onItemClickListener было проблематичным . Момент, когда вы щелчок слушателя для любого из внутренних элементовобратного вызова не будет вызываться, но это не был уведомлен или хорошо документированы ( если вообще) так что не быломного путаницы и так вопросы на эту тему .

Учитывая, что RecyclerView берет егодальше и не есть понятие строке / колонке, апроизвольно выложил количество детей, они делегировали OnClick для каждого из них, или программисту реализацию.

Подумайте о Recyclerview не как ListView 1 : 1 замену, но, скорее, как более гибкой компонента для сложных случаев использования. И, как вы говорите, ваше решение, что Google ожидать от вас . Теперь у вас есть адаптер, который может делегировать OnClick к интерфейсу передаются конструктору, который являетсяправильным образцом для обоих ListView и 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);
}

}

а затем на адаптере

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

  ...

Теперь посмотрим на этот последний кусок кода : onCreateViewHolder(ViewGroup parent, int viewType)подпись уже предлагают различные типы просмотра. Для каждого из них вы требуют иного viewholder также, и затем каждый из них может иметь различный набор щелчков . Или вы можете просто создать общий viewholder, который принимает любое представление и один onClickListener и действует соответственно . Или делегировать на один уровень вверх в Orchestrator так несколько фрагментов / мероприятия имеют тот же список с различным поведением мыши. Опять же, все гибкость на вашей стороне .

Этодействительно необходимо компонент и довольно близко к тому, что наши внутренние реализации и улучшения в ListView не было до сих пор. Это хорошо, что Google наконец признает его.

2Tarun Varshney @

> Как RecyclerView отличается от ListView ?

Одно из отличий является то, что есть класс LayoutManager с RecyclerView, с помощью которого вы можете управлять вашим RecyclerView как-

Горизонтальная или вертикальная прокрутка с помощью LinearLayoutManager

GridLayout по GridLayoutManager

В шахматном порядке GridLayout по StaggeredGridLayoutManager

Как и в случае горизонтальной прокрутки для 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;
            }
        });

Реализуйте этот внутренний конструктор ViewHolder .