我的目标(为了一个简单的例子)是检测LinearLayout内的ImageView上的点击。每个由LinearLayout表示的项目列表使用RecyclerView设置。
public class SomeRecyclerAdapter extends RecyclerView.Adapter<SomeRecyclerAdapter.SomeListViewHolder> {
....
@Override
public void onBindViewHolder(final SomeViewHolder holder, final int position) {
SomeItem item = someList.get(position);
holder.vImage.setTag(item);
holder.vImage
.setOnClickListener(new CompoundButton.OnClickListener(){
@Override
public void onClick(View v) {
SomeListItem item = (SomeItem) holder.vImage.getTag();
Toast.makeText(context, item.getName() + " Image Clicked", Toast.LENGTH_SHORT).show();
}
});
....
public static class SomeListViewHolder extends RecyclerView.ViewHolder{
protected ImageView vImage;
public SomeListViewHolder(View itemView) {
super(itemView);
vImage = (ImageView) itemView.findViewById(R.id.tem_some_list);
}
}
}
这种方法可以正常运行但是,虽然我没有足够的知识来陈述,但它似乎并不是一种有效的工具。
我试图用onInterceptTouchEvent实现这个,但我只能点击LinearLayout,意思是项目,而不是按钮(图像,在这种情况下)。
如果我写错了,或者如果我想要的话有替代方法,请告诉我。
答案 0 :(得分:3)
将项目绑定到视图,并让ViewHolders自己处理点击。像这样:
public class SomeItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private final ImageView mImg;
private SomeItem mBoundItem;
public SomeItemViewHolder(View view) {
mImg = view.findViewById(R.id.imageId);
mImg.setOnClickListener(this);
}
...
public void bind(SomeItem item) {
mBoundItem = item;
// Update the ViewHolder to the item's specifications.
}
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), mBoundItem.getName() + " Image Clicked", Toast.LENGTH_SHORT).show();
}
}
然后,在适配器中,只需调用它。
@Override
public void onBindViewHolder(SomeItemViewHolder holder, int position) {
SomeItem item = someList.get(position);
holder.bind(item);
}