Adapter 的 ViewHolder 中的 @OnClick 方法未指向正确的列表项
@OnClick method within Adapter's ViewHolder doesn't point on the right list item
我最近目睹了一个奇怪的行为,当我使用 ButterKnife 在 Adapter 中绑定图像按钮的 OnClick 方法时,正如这个问题的标题所指出的那样。正如文档中所建议的,我声明了一个内部 class ViewHolder,其中发生了所有 @Bind
声明,我也有 @OnClick
。
我的 ViewHolder class 看起来像这样:
class ViewHolder {
private Product product;
@Bind(R.id.title)
TextView text;
@Bind(R.id.price)
TextView price;
public ViewHolder(View view, Product product) {
ButterKnife.bind(this, view);
this.product = product;
}
@OnClick(R.id.image_button)
public void launchProductFragment() {
ProductFragment fragment = new ProductFragment();
Bundle args = new Bundle();
args.putInt(Tools.WS_PRODUCT_GROUP_ID, product.getId());
FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
}
}
注意:当我直接在我的 getView
方法中设置一个很好的旧 OnClickListener 时,点击工作正常,并显示预期的结果。
这是一个已知问题吗?还是我在实施中所做的事情导致了它?
不要在构造函数中传递Product
,在Adapter
.
的getView()
方法中传递给viewholder
class ViewHolder {
private Product product;
void bindProduct(Product product) {
this.product = product;
}
}
在您的适配器中执行以下操作:
@Override
public void getView(int position, View convertView, ViewGroup parent) {
// Some code here
holder.bindProduct(myproductlist.get(position));
//other code...
}
我最近目睹了一个奇怪的行为,当我使用 ButterKnife 在 Adapter 中绑定图像按钮的 OnClick 方法时,正如这个问题的标题所指出的那样。正如文档中所建议的,我声明了一个内部 class ViewHolder,其中发生了所有 @Bind
声明,我也有 @OnClick
。
我的 ViewHolder class 看起来像这样:
class ViewHolder {
private Product product;
@Bind(R.id.title)
TextView text;
@Bind(R.id.price)
TextView price;
public ViewHolder(View view, Product product) {
ButterKnife.bind(this, view);
this.product = product;
}
@OnClick(R.id.image_button)
public void launchProductFragment() {
ProductFragment fragment = new ProductFragment();
Bundle args = new Bundle();
args.putInt(Tools.WS_PRODUCT_GROUP_ID, product.getId());
FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
}
}
注意:当我直接在我的 getView
方法中设置一个很好的旧 OnClickListener 时,点击工作正常,并显示预期的结果。
这是一个已知问题吗?还是我在实施中所做的事情导致了它?
不要在构造函数中传递Product
,在Adapter
.
getView()
方法中传递给viewholder
class ViewHolder {
private Product product;
void bindProduct(Product product) {
this.product = product;
}
}
在您的适配器中执行以下操作:
@Override
public void getView(int position, View convertView, ViewGroup parent) {
// Some code here
holder.bindProduct(myproductlist.get(position));
//other code...
}