为什么RecyclerView没有onItemClickListener()? RecyclerView与Listview有何区别?

问题:

我正在探索RecyclerView,我很惊讶地发现RecyclerView没有onItemClickListener()。因为RecyclerView延伸

 android.view.ViewGroup

ListView延伸

 android.widget.AbsListView

。但是我在RecyclerView.Adapter中写下onClick解决了我的问题

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) {

    }
}

但是我仍然想知道Google为何删除onItemClickListener()
是否有性能问题或其他问题?

回答:

 tl; dr 2016使用RxJava和PublishSubject来显示点击的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();
    }
}

 原帖:
自引入ListView以来,onItemClickListener一直是有问题的。当您有任何内部元素的点击监听器的时候,回调不会被触发,但没有被通知或记录在案(如果有的话),所以有很多混乱和关于它的问题。
鉴于RecyclerView更进一步,没有一行/列的概念,而是一个任意排列的孩子数量,他们已经将onClick委托给其中每一个,或者编程人员实现。
想想Recyclerview不是ListView 1:1替换,而是复杂用例的更灵活的组件。正如你所说,你的解决方案是谷歌对你的期望。现在你有一个适配器可以将onClick委托给在构造函数上传递的接口,这是ListViewRecyclerview的正确模式

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

}

然后在适配器上

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

现在看看最后一段代码:onCreateViewHolder(ViewGroup parent, int viewType)签名已经建议不同的视图类型。对于他们中的每一个,您将需要不同的观看者,随后每个人都可以拥有不同的点击集。或者你可以创建一个通用的观察者,它接受任何视图,一个onClickListener并且相应地应用。或者将一级委托给协调者,以使多个片段/活动具有与不同点击行为相同的列表。同样,所有的灵活性在你身边。
这是一个非常需要的组件,并且非常接近我们的内部实现和对ListView的改进到目前为止。 Google终于承认了这一点。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why doesn’t RecyclerView have onItemClickListener()? And how RecyclerView is different from Listview?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

6 + 1 =