Android 我应该将setOnClickListener放置在RecyclerView适配器的何处
在internet上的教程中,他们在RecyclerView的适配器中设置ClickListener,他们用两种方式定义它:在ViewHolder内部或在BindViewHolder内部 我的问题是哪种方法更好,请推荐其他方法(如果可用) 1) 内视窗座:Android 我应该将setOnClickListener放置在RecyclerView适配器的何处,android,android-viewholder,android-recyclerview,Android,Android Viewholder,Android Recyclerview,在internet上的教程中,他们在RecyclerView的适配器中设置ClickListener,他们用两种方式定义它:在ViewHolder内部或在BindViewHolder内部 我的问题是哪种方法更好,请推荐其他方法(如果可用) 1) 内视窗座: public static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(it
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
tvSrc = (TextView) itemView.findViewById(R.id.tvSrc);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "inside viewholder position = " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
}
});
}
2) 内置活页夹
public void onBindViewHolder(DisplayTrainsAdapter.ViewHolder viewHolder, final int position) {
viewHolder.tvSrc.setText(mDataset.get(position).strSrc);
viewHolder.tvSrc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "position = " + getItemId(position), Toast.LENGTH_SHORT).show();
}
});
}
在ViewHolder()
中,我想,因为您定义了view
所包含的内容以及它的内部功能和其他功能
但是
onBindViewHolder()
你说view
,它是在ViewHolder
中定义的,将有这个文本,这个图像…newviewholder(View)
在实际显示内容之前确实设置了onClickListener。这很好,因为在调用onBindView时,已经在视图上设置了onClickListener
我认为在构造函数
ViewHolder(View)
中实现这一点的代码也更简洁,正如您所建议的那样,您的1号解决方案是最好的,因为notify..()方法触发的每个invalidate()方法都不会在绑定中调用该赋值。
我也知道其他解决方案,但您需要在活动中实现android.view.GestureDetector
如果您希望对适配器进行其他改进,请查看我的FlexibleAdapter,并在您的项目中自由实施。这两个选项都有其优缺点 例如,如果单击了一个按钮,并且您想要更改按钮的文本,那么您可能应该使用在ViewHolder中设置onClick侦听器的选项。除此之外,它还使代码看起来更干净
但是,如果您想在单击按钮时更改与单击按钮相同索引/位置的TextView文本,则需要使用在onBindViewHolder方法中设置onClick侦听器的选项。您应该始终检查getAdapterPosition是否>=0,因为它可能是-1(无位置)在极少数情况下,会导致应用程序崩溃 让您的自定义ViewHolder实现View.OnClickListener,这样您就不需要ViewHolder中的自定义View.OnClickListener类这没有任何意义,您可以在这两种情况下同时执行这两种操作