java– 为什么RecyclerView没有onItemClickListener()?

java– 为什么RecyclerView没有onItemClickListener()?,第1张

概述我正在探索RecyclerView,我很惊讶地发现RecyclerView没有onItemClickListener().因为RecyclerView扩展了android.view.ViewGroup和ListView扩展android.widget.AbsListView.但是我通过在RecyclerView.Adapter中编写onClick解决了我的问题:publicstaticclassViewHolde

我正在探索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) {    }}

但我还是想知道为什么谷歌删除了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一直存在问题.当你有任何内部元素的点击监听器时,不会触发回调但是没有通知或记录良好(如果有的话),所以存在很多混淆和SO问题.

鉴于RecyclerVIEw更进一步,并没有行/列的概念,而是任意布局的子项数量,他们已经将onClick委托给它们中的每一个,或者程序员实现.

将RecyclervIEw视为ListVIEw 1:1替代品,而不是复杂用例的更灵活组件.正如你所说,你的解决方案是谷歌对你的期望.现在你有了一个适配器,可以将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);        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的内部实现和改进非常接近.谷歌最终承认这一点很好.

总结

以上是内存溢出为你收集整理的java – 为什么RecyclerView没有onItemClickListener()?全部内容,希望文章能够帮你解决java – 为什么RecyclerView没有onItemClickListener()?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1104525.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存