为什么 ViewHolder 上的 OnClickListener 不起作用?
Why does OnClickListener on a ViewHolder don't work?
我正在尝试实现一种方法来处理 RecyclerView
上的项目选择。我个人不喜欢一些关于 SO 的答案中建议的通过手势的方式,我认为按照 here and here 的建议实施 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
的事情也是不可接受的:我试过了,但是此方法为您提供了项目在列表的 visibile 部分中的位置,因此使 list.remove(position)
不可能。
查看更新后的代码:您没有将 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.
} });
}
只需单击 Handler 您的 ViewHolder。 Recycler View 没有像 ListView 这样有方法 setOnItemClickListener() 的特殊附加点击处理程序。
** public class ViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener
** in public ViewHolder(Context context, View itemView) set public void onClick(View view)
** 通过以下方式获取位置:int position = getLayoutPosition();用户user = users.get(position);
我正在尝试实现一种方法来处理 RecyclerView
上的项目选择。我个人不喜欢一些关于 SO 的答案中建议的通过手势的方式,我认为按照 here and here 的建议实施 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
的事情也是不可接受的:我试过了,但是此方法为您提供了项目在列表的 visibile 部分中的位置,因此使 list.remove(position)
不可能。
查看更新后的代码:您没有将 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.
} });
}
只需单击 Handler 您的 ViewHolder。 Recycler View 没有像 ListView 这样有方法 setOnItemClickListener() 的特殊附加点击处理程序。
** public class ViewHolder 扩展 RecyclerView.ViewHolder 实现 View.OnClickListener
** in public ViewHolder(Context context, View itemView) set public void onClick(View view)
** 通过以下方式获取位置:int position = getLayoutPosition();用户user = users.get(position);