【已解决】 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那里设置点击事件,而不是在构造方法里创建。
@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if(position==0){ TitleHolder holder1=(TitleHolder)holder; holder1.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击第一个添加图片 if(mOnAddClickListener!=null){ mOnAddClickListener.OnAddClick(position); } } }); }else{ TupianHolder holder2=(TupianHolder)holder; //展示图片 PicBean picBean= mData.get(position); PicBean mPicBean = picBean; holder2.imageView.setScaleType(ImageView.ScaleType.FIT_XY); Glide.with(holder2.imageView.getContext()).load(picBean.getPicPath()).into(holder2.imageView); //点击减号删除图片 holder2.img_cha.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mOnDelClickListener!=null){ mOnDelClickListener.OnDelClick(position,mPicBean.upLoadPath); } } }); } }感谢老师,我把点击事件放到onBindViewHolder 中就好了
(老师的课程多类型里面,24:21 ,设置绑定,跳过了。。。。跳过了)
看了老师的 recycle 至少10遍了,我果然是个憨憨