我的ViewHolder
实现了View.OnClickListener
,正如this answer中的建议。除此之外,我再次检查了我的适配器类与官方文档中的示例类似。为什么我的RecyclerView.ViewHolder的onClick方法有时不被调用?
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private View view;
public ViewHolder(View view) {
super(view);
view.setOnClickListener(this);
this.view = view;
}
public View getView() {
return view;
}
@Override
public void onClick(View view) {
Context context = view.getContext();
Intent intent = new Intent(context, DetailsActivity.class);
context.startActivity(intent);
}
}
但如果我测试我的应用程序我观察这个非常奇怪的现象:如果我攻上排在启动过程中看到,如预期执行onClick
方法。现在我向下滚动,使其他行可见。我点击某处并没有任何反应,第二次点击 - 如果它在同一行上 - 再次运行。如果我滚动回到顶部,则会发生同样的情况,我必须点击两次以获取我的onClick
方法。
任何想法为什么会发生这种情况?
编辑:的完整代码,现在设置听者onBindViewHolder
:
public class ComposersAdapter extends RecyclerView.Adapter<ComposersAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder {
private View view;
public ViewHolder(View view) {
super(view);
this.view = view;
}
public View getView() {
return view;
}
}
private final String EXTRA_COMPOSER_ID = "composerId";
private List<Composer> composers;
public ComposersAdapter(List<Composer> composers) {
this.composers = composers;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
View view = holder.getView();
TextView textView = view.findViewById(R.id.textView);
textView.setText(composers.get(position).getTitle());
holder.getView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Context context = view.getContext();
Intent intent = new Intent(context, ComposerActivity.class);
intent.putExtra(EXTRA_COMPOSER_ID, holder.getAdapterPosition());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return composers.size();
}
}
UPDATE:这个问题似乎被连接到RecyclerView驻留在我设置app:layout_scrollFlags="scroll|enterAlways"
活动的工具栏。如果我删除该问题不存在了。也许这与工具栏捕捉触摸事件有关?我没有足够的经验来检查我自己。
为什么不在onBindViewHolder中完成它?而不是在这里有一个点击监听器,试试在绑定方法的根视图上有一个 – Kushan
你是对的,这是更清洁。但问题依然存在。 –
对不起,我刚刚看到了Kushan的评论。 @Elias,请提供适配器的完整代码,我想你可能会错误地持有/分配视图引用。 – rgv