我正在尝试实现一种处理RecyclerView
项目选择的方法。我个人不喜欢在通过手势的一些答案中建议的方式,我认为按照建议here和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
这样的事情也是不可接受的:我试过,但是这个method为您提供列表中 visibile 部分中项目的位置,从而使list.remove(position)
无法使用。
答案 0 :(得分:47)
查看更新的代码:您没有将onClickListener设置为ViewHolder中的任何视图。忘记点击监听器是一个可以理解的错误。
只需使用:
tvName.setOnClickListener(this);
star.setOnClickListener(this);
您可以设置为两者或仅设置其中一个。您还可以简单地获取这两个视图的父布局,以便适配器中的整个项目本身可以单击。
itemView.setOnClickListener(this);
答案 1 :(得分:3)
您可以在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.
} });
}
答案 2 :(得分:0)
只需单击“处理您的ViewHolder”。 Recycler View没有特殊的附加单击处理程序,例如ListView,它具有setOnItemClickListener()方法。
** 公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener
** 在公共ViewHolder(上下文上下文,View itemView)中设置public void onClick(查看视图)
** 通过以下方式获取位置:int position = getLayoutPosition();用户user = users.get(position);