
我正在探索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()?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)