Android 为什么ViewHolder上的OnClickListener不';不行?
我正在尝试实现一种在Android 为什么ViewHolder上的OnClickListener不';不行?,android,onclick,onclicklistener,android-recyclerview,Android,Onclick,Onclicklistener,Android Recyclerview,我正在尝试实现一种在RecyclerView上处理项目选择的方法。我个人不喜欢一些答案中建议的传递手势的方式,我认为实现一个OnClickListener,就像建议的那样,是非常干净的 事实是。。。这种模式实际上不起作用!我真的无法理解为什么我的OnClickListener.onClick从未被调用。这有点像另一种方法在onClick处理它之前拦截单击 这是我的代码: public class ViewHolder extends RecyclerView.ViewHolder imp
RecyclerView
上处理项目选择的方法。我个人不喜欢一些答案中建议的传递手势的方式,我认为实现一个OnClickListener
,就像建议的那样,是非常干净的
事实是。。。这种模式实际上不起作用!我真的无法理解为什么我的OnClickListener.onClick
从未被调用。这有点像另一种方法在onClick
处理它之前拦截单击
这是我的代码:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tvName;
ImageView star;
public ViewHolder(View itemView) {
super(itemView);
tvName = (TextView) itemView.findViewById(R.id.CHAT_ITEM_name);
star = (ImageView) itemView.findViewById(R.id.CHAT_ITEM_star);
Fonts.setTypeface(tvName, regular);
}
@Override
public void onClick(View view) {
int position = getLayoutPosition();
select(position);
}
}
不幸的是,能够访问整个数据集中已单击项的位置对我来说非常重要,以便将其删除,因此像
indexOfChild
这样的操作也是不可接受的:我尝试过,但此方法会为您提供项在列表可视部分的位置,从而使list.remove(位置)
不可能。查看更新的代码:您没有将onClickListener设置为ViewHolder中的任何视图。忘记单击侦听器是可以理解的错误
只需使用:
tvName.setOnClickListener(this);
star.setOnClickListener(this);
您可以同时设置或仅设置其中一个。您还可以简单地获得这两个视图的父布局,这样适配器中的整个项目本身就可以单击
itemView.setOnClickListener(this);
您可以在onBindViewHolder中执行此操作
@Override
public void onBindViewHolder(ReportViewHolder holder, int position {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// handle your click here.
} });
}
简单地单击ViewHolder。回收器视图没有特殊的附加单击处理程序,如ListView,它具有setOnItemClickListener()方法 **公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener **在公共视图持有者(上下文上下文,视图项视图)中,单击(视图视图)设置公共void
**通过以下方式获取位置:int position=getLayoutPosition();User=users.get(位置)但它可以工作。你能发布你的ViewHolder的所有代码吗?这样我们就可以看到缺少了什么?@androidpotato7当然-刚刚更新了代码!此方法对性能而言不是最优的。!!!在ViewHolder的构造函数中更有效地设置Click listeners。每次在RecyclerView中显示新项时都会调用onBindViewHolder()方法,因此,如果您有一个非常大的列表,您最终会不必要地创建数百个甚至更多的Click listeners。在ViewHolder中创建侦听器会将创建的侦听器数量限制在合理的范围内。(大致相当于屏幕上的项目数)我同意,特别是如果项目数是动态的而不是静态的。多么糟糕的设计,你必须实际设置它,而仅仅覆盖
onClick
是不起作用的。非常直观:-\