【已解决】 recycleview 多类型 点击事件
我recycleview 有两种类型 ,第一种是添加图片,第二种是图片

我现在点击第二种,结果点击事件中 postion 永远是5 (最大数量) 不是对应的postion (1,2,3,4,5)
我在tupian_holder中 添加点击事件 打印出来nPostion 永远是5 不是点击哪个是哪个
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: 我点的是第几个 "+nPostion);
}
});
有人能看看我这个postion为啥没变吗?谢谢各位大佬
代码如下
//根据界面的类型返回不同的界面
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
if(viewType==TYPE_TITLE){
view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pic_first,parent,false);
return new TitleHolder(view);
}else if(viewType==TYPE_TUPIAN) {
view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pic_others,parent,false);
return new TupianHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(position==0){
TitleHolder.setData(mData.get(position),position);
}else{
TupianHolder.setData(mData.get(position),position);
}
}
@Override
public int getItemCount() {
if(mData!=null){
return mData.size();
}
return 0;
}
//返回界面的类型
@Override
public int getItemViewType(int position) {
if(position==0){
return TYPE_TITLE;
}else{
return TYPE_TUPIAN;
}
}
//点击第一个加号的图片,去增加图片
public void setOnAddClickListener(OnAddClickListener listener) {
//设置一个监听,就是需要一个接口,和回调接口
this.mOnAddClickListener=listener;
}
public interface OnAddClickListener{
void OnAddClick(int position);
}
//点击删除图片的接口
public void setOnDelClickListener(OnDelClickListener listener) {
//设置一个监听,就是需要一个接口,和回调接口
this.mOnDelClickListener=listener;
}
public interface OnDelClickListener{
void OnDelClick(int position,String uploadPath);
}
private static class TitleHolder extends RecyclerView.ViewHolder{
private static TextView tv_title = null;
private static int mPostion;
public TitleHolder(@NonNull View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mOnAddClickListener!=null){
mOnAddClickListener.OnAddClick(mPostion);
}
}
});
}
public static void setData(PicBean picBean, int position) {
mPostion=position;
}
}
private static class TupianHolder extends RecyclerView.ViewHolder{
private static ImageView imageView;
private final ImageView img_cha;
private static int nPostion;
private static PicBean mPicBean;
public TupianHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.load_img);
img_cha = itemView.findViewById(R.id.img_cha);
img_cha.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mOnDelClickListener!=null){
mOnDelClickListener.OnDelClick(nPostion,mPicBean.upLoadPath);
}
}
});
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: 我点的是第几个 "+nPostion);
}
});
}
public static void setData(PicBean picBean, int position) {
mPicBean = picBean;
nPostion = position;
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
Glide.with(imageView.getContext()).load(picBean.getPicPath()).into(imageView);
}
}
你写的不对呢。我没这么教呀。你要知道,ViewHolder的创建次数是有限的。因为复用呀。
但是,bindData数据是多次调用的,所以。你要在bindData那里设置点击事件,而不是在构造方法里创建。
感谢老师,我把点击事件放到onBindViewHolder 中就好了
(老师的课程多类型里面,24:21 ,设置绑定,跳过了。。。。跳过了)
看了老师的 recycle 至少10遍了,我果然是个憨憨