java – 为什么RecyclerView没有onItemClickListener()?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么RecyclerView没有onItemClickListener()?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4074字,纯文字阅读大概需要6分钟。
内容图文
![java – 为什么RecyclerView没有onItemClickListener()?](/upload/InfoBanner/zyjiaocheng/717/1ae296a398b64933a43443085d3e5650.jpg)
我正在探索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()?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。