我有一个RecyclerView,每个项目都有一个自定义视图。这个自定义视图只包含一个收藏的ImageView。我在我的holder类中设置onclick,如下所示:
class DataViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private OnItemViewClickListener onItemViewClickListener;
private OnFavoriteImageViewClickListener onFavoriteImageViewClickListener;
private ImageView favoriteImageView;
DataViewHolder(View itemView, OnItemViewClickListener onItemViewClickListener,
OnFavoriteImageViewClickListener onFavoriteImageViewClickListener) {
super(itemView);
this.onItemViewClickListener = onItemViewClickListener;
itemView.setOnClickListener(this);
favoriteImageView = itemView.findViewById(R.id.favorite_image_view);
this.onFavoriteImageViewClickListener = onFavoriteImageViewClickListener;
favoriteImageView.setOnClickListener(this);
}
void bindData(Data data) {
//Bind data to views
}
@Override
public void onClick(View v) {
int position = getAdapterPosition();
Data clickedData = getItem(position);
onItemViewClickListener.onItemViewClick(clickedData);
onFavoriteImageViewClickListener.onFavoriteImageViewClick(clickedData);
}
}
public interface OnItemViewClickListener {
void onItemViewClick(Data data);
}
public interface OnFavoriteImageViewClickListener {
void onFavoriteImageViewClick(Data data);
}如您所见,我在整个视图和图像视图上分别设置了一次单击侦听器。问题是,当我单击ImageView时,两个单击事件都会触发,一个是整个视图,另一个是ImageView。是否停止第一个(在整个视图上)并只保留ImageView中的一个?谢谢!
发布于 2019-07-09 00:46:46
您可以通过计算View的id属性来找出单击了哪个View.getId(),另请参阅View.getId()
@Override
public void onClick(View view) {
int position = getAdapterPosition();
Data clickedData = getItem(position);
int id = view.getId();
if (id == R.id.favorite_image_view){
onFavoriteImageViewClickListener.onFavoriteImageViewClick(clickedData)
}
else {
onItemViewClickListener.onItemViewClick(clickedData);
}
}发布于 2019-07-09 00:38:28
您可以使用类似于下面的内容。在单个接口中使用两个方法定义,并将这两个方法分别设置为View和ImageView的clickListeners。然后在用来设置Adapter的活动中实现这些方法
class DataViewHolder extends RecyclerView.ViewHolder {
private dataViewClickListener dataViewClickListener;
private ImageView favoriteImageView;
DataViewHolder(View itemView, final dataViewClickListener dataViewClickListener) {
super(itemView);
this.dataViewClickListener = dataViewClickListener;
favoriteImageView = itemView.findViewById(R.id.favorite_image_view);
}
void bindData(final Data data) {
// Bind data to views
// then add the listeners
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataViewClickListener.onItemViewClick(data);
}
});
favoriteImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataViewClickListener.onFavoriteImageViewClick(data);
}
});
}
}
public interface dataViewClickListener {
void onItemViewClick(Data data);
void onFavoriteImageViewClick(Data data);
}您可以从这个answer中找到更多信息
发布于 2019-07-09 01:36:00
使用Id,您可以识别哪个视图被单击。您可以通过计算视图的id属性来找出单击了哪个视图。您也可以使用简单if条件的开关来管理操作。
@Override public void onClick(View v) {
Data clickedData = getItem(getAdapterPosition());
switch(v.getId()){
case R.id.favorite_image_view:
onFavoriteImageViewClickListener.onFavoriteImageViewClick(clickedData)
break;
// Add more case view id if needed
default:
onItemViewClickListener.onItemViewClick(clickedData);
}
}https://stackoverflow.com/questions/56938811
复制相似问题