在互联网上的教程中,他们在 RecyclerView 的适配器中设置OnClickListener,他们以两种方式定义它:在 ViewHolder 内或在 BindViewHolder 内。
我的问题是哪种方法更好,请推荐其他方法(如果有)
1) ViewHolder 内部:
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) BindViewHolder 内部
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();
}
});
}
您的第 1 号解决方案是您建议的最佳解决方案,因为在每次由 notification..() 方法触发的无效时,不会在绑定中调用该分配。 我也知道其他解决方案,但你需要在你的活动中实现 android.view.GestureDetector 。
如果您希望对适配器进行其他改进,请查看我的FlexibleAdapter https://github.com/davideas/FlexibleAdapter并随意在您的项目中实现。
两种选择都有其优点和缺点。
例如,如果单击按钮并且您想要更改按钮的文本,那么您可能应该使用在 ViewHolder 中设置 onClick 侦听器的选项。除了这个原因,它还让你的代码看起来更干净。
但是,如果单击按钮时,您想要更改与单击的按钮相同索引/位置的 TextView 的文本,则需要使用在 onBindViewHolder 中设置 onClick 侦听器的选项方法。
恕我直言:我喜欢数字 1。
自从您调用
new ViewHolder(View)
以来,您在实际显示内容之前确实设置了 onClickListener 。这很好,因为在调用 onBindView 时,您的 onClickListener 已经在您的视图上设置了。
我认为在构造函数中执行此操作的代码也更清晰
ViewHolder(View)
在
ViewHolder()
中,我猜,因为您定义了 view
所持有的内容以及它的内部功能和其他功能。
但是
onBindViewHolder()
你说view
,它在ViewHolder
中定义,将会有这个文本,这个图像......
您应该始终检查 getAdapterPosition 是否 >= 0,因为在极少数情况下它可能是 -1 (NO_POSITION),这可能会导致应用程序崩溃。 https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder#getadapterposition