gpt4 book ai didi

java - 为什么有时不调用我的 RecyclerView.ViewHolder 的 onClick 方法?

转载 作者:行者123 更新时间:2023-11-30 00:12:04 24 4
gpt4 key购买 nike

我的 ViewHolder 按照 this answer 中的建议实现了 View.OnClickListener .除此之外,我仔细检查了我的适配器类是否与官方文档中的示例相似。

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();
}
}

更新:这个问题似乎与 RecyclerView 所在的 Activity 的工具栏有关。我已经设置了 app:layout_scrollFlags="scroll|enterAlways" 并且如果我删除了问题不再存在。也许这与工具栏捕获触摸事件有关?我没有足够的经验亲自检查。

最佳答案

在中分配点击监听器onBindViewHolder(RecyclerView.ViewHolder holder, int position).

onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// start some activity
}
});
}

On Bind View Holder 是当一个 viewholder 正确绑定(bind)到适配器并且 View 的各个实例在此处可用时。

holder.itemView 

将为您提供对 viewHolder 的 View 实例的引用。因此,您不会像 ViewHolder 中的方法那样getView()

关于java - 为什么有时不调用我的 RecyclerView.ViewHolder 的 onClick 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47997827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com