Android 插入或删除NotifyItemRange后,该位置没有';不要换衣服

Android 插入或删除NotifyItemRange后,该位置没有';不要换衣服,android,Android,在本例中,我使用GridLayoutManager。我点击一个项目,然后在它下面会显示一些图片 我在适配器的资源中添加了三个数据,然后调用notifyItemRangeInserted(位置3) 然后在项目(position=3)下,我单击了“出来三个新项目”,并记录了它们的位置。这三个新项目的位置是4,5,6。但当我单击7项时,它会将其位置记录为3。我不明白 下面是我的一些代码。我的英语不是很好。请原谅我 final RecyclerView recyphoto = new Recyc

在本例中,我使用
GridLayoutManager
。我点击一个项目,然后在它下面会显示一些图片

我在适配器的资源中添加了三个数据,然后调用notifyItemRangeInserted(位置3) 然后在项目(position=3)下,我单击了“出来三个新项目”,并记录了它们的位置。这三个新项目的位置是4,5,6。但当我单击7项时,它会将其位置记录为3。我不明白

下面是我的一些代码。我的英语不是很好。请原谅我

    final RecyclerView recyphoto = new RecyclerView(this);
    GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            if (recyphoto.getAdapter().getItemViewType(position)==1){
                return 3;
            }else {
                return 1;
            }
        }
    });


@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {


    if(infos.get(position).getType()==1){
        final ViewHolderOne holderOne = ((ViewHolderOne)holder);

        if(infos.get(position).isExpand()){
            holderOne.imageArrow.setImageDrawable(context.getDrawable(R.drawable.arrowdown));
        }else{
            holderOne.imageArrow.setImageDrawable(context.getDrawable(R.drawable.arrow));

        }

        TextView tv =  holderOne.textView;
        tv.setText(infos.get(position).getName());
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                List<FileInfo> childs = infos.get(position).getChilds();
                int childSize = 0;

                if(childs!=null){
                    childSize=childs.size();
                }

                LogUtil.e(position +"POS");

                if(!infos.get(position).isExpand()) {

                    if(childs!=null) {
                        infos.addAll(position + 1, childs);
                    }
                    infos.get(position).setExpand(true);

                    notifyItemRangeInserted(position,childSize);

                        if(onScrollToBottomListener!=null)
                            onScrollToBottomListener.onBottom(position,infos.size());
                }else{
                    infos.subList(position + 1 , position + 1+childSize).clear();
                    infos.get(position).setExpand(false);
                    notifyItemRangeRemoved(position,childSize);
                }




            }
        });
    }else if(infos.get(position).getType()==2){
        final ViewHolderTwo holderTwo = ((ViewHolderTwo)holder);
        Glide.with(context).load(infos.get(position).getLocation()).override(200,200).centerCrop().into( holderTwo.imageView);

        holderTwo.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!holderTwo.checkPhoto.isChecked()) {
                    sendDatas.add(infos.get(position));
                    holderTwo.checkPhoto.setChecked(true);
                    holderTwo.checkPhoto.setVisibility(View.VISIBLE);
                    onSendDataChangeListener.onSendDataChange(sendDatas);
                }else{
                    sendDatas.remove(infos.get(position));
                    holderTwo.checkPhoto.setChecked(false);
                    holderTwo.checkPhoto.setVisibility(View.INVISIBLE);
                    onSendDataChangeListener.onSendDataChange(sendDatas);
                }
            }
        });

        if(belong(sendDatas,position)){
            holderTwo.checkPhoto.setChecked(true);
            holderTwo.checkPhoto.setVisibility(View.VISIBLE);
        }else{
            holderTwo.checkPhoto.setChecked(false);
            holderTwo.checkPhoto.setVisibility(View.INVISIBLE);
        }
    }
}

@Override
public int getItemCount() {
    return infos.size();
}

private class ViewHolderOne extends  RecyclerView.ViewHolder{

    TextView textView ;
    ImageView imageArrow;

    ViewHolderOne(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.textView);
        imageArrow = (ImageView) itemView.findViewById(R.id.image_arrow);
    }
}

private class ViewHolderTwo extends RecyclerView.ViewHolder{

    ImageView imageView ;
    CheckBox checkPhoto;

    ViewHolderTwo(View itemView) {
        super(itemView);
        imageView = (ImageView) itemView.findViewById(R.id.imageView);
        checkPhoto = (CheckBox) itemView.findViewById(R.id.check_photo);
    }
}



@Override
public int getItemViewType(int position) {
    return infos.get(position).getType();
}

private boolean belong(List<FileInfo> sendDatas, int pos) {
    String str = infos.get(pos).getLocation();
    for (int i = 0; i < sendDatas.size(); i++) {
        if (str.equals(sendDatas.get(i).getLocation()))
            return true;
    }
    return false;
}
final RecyclerView recyphoto=new RecyclerView(本);
GridLayoutManager GridLayoutManager=新的GridLayoutManager(这个,3);
gridLayoutManager.setPansizeLookup(新的gridLayoutManager.SpanSizeLookup(){
@凌驾
公共整数getSpanSize(整数位置){
if(recyphoto.getAdapter().getItemViewType(位置)==1){
返回3;
}否则{
返回1;
}
}
});
@凌驾
公共无效onBindViewHolder(最终RecyclerView.ViewHolder,最终整型位置){
if(infos.get(position.getType()==1){
最终ViewHolderOne holderOne=((ViewHolderOne)holder);
if(infos.get(position.isExpand()){
holderOne.imageArrow.setImageDrawable(context.getDrawable(R.drawable.arrowdown));
}否则{
holderOne.imageArrow.setImageDrawable(context.getDrawable(R.drawable.arrow));
}
TextView tv=holderOne.TextView;
tv.setText(infos.get(position.getName());
tv.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
List childs=infos.get(position.getChilds();
int childSize=0;
if(childs!=null){
childSize=childs.size();
}
LogUtil.e(位置+“位置”);
如果(!infos.get(position.isExpand()){
if(childs!=null){
信息添加全部(位置+1,儿童);
}
infos.get(position).setExpand(true);
notifyItemRangeInserted(位置、子尺寸);
if(onScrollToBottomListener!=null)
onScrollToBottomListener.onBottom(位置,infos.size());
}否则{
子列表(位置+1,位置+1+childSize).clear();
infos.get(position).setExpand(false);
notifyItemRangeRemoved(位置、子尺寸);
}
}
});
}else if(infos.get(position.getType()==2){
最终ViewHolderTwo holderTwo=((ViewHolderTwo)holder);
Glide.with(context).load(infos.get(position).getLocation()).override(200200).centerCrop().into(holderTwo.imageView);
holderTwo.imageView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(!holderTwo.checkPhoto.isChecked()){
add(infos.get(position));
holdertw.checkPhoto.setChecked(true);
holdertw.checkPhoto.setVisibility(View.VISIBLE);
onSendDataChangeListener.onSendDataChange(sendDatas);
}否则{
remove(infos.get(position));
holdertw.checkPhoto.setChecked(false);
holdertw.checkPhoto.setVisibility(View.INVISIBLE);
onSendDataChangeListener.onSendDataChange(sendDatas);
}
}
});
如果(属于(发送数据、位置)){
holdertw.checkPhoto.setChecked(true);
holdertw.checkPhoto.setVisibility(View.VISIBLE);
}否则{
holdertw.checkPhoto.setChecked(false);
holdertw.checkPhoto.setVisibility(View.INVISIBLE);
}
}
}
@凌驾
public int getItemCount(){
返回infos.size();
}
私有类ViewHolder扩展了RecyclerView.ViewHolder{
文本视图文本视图;
图像视图图像箭头;
ViewHolderOne(查看项目视图){
超级(项目视图);
textView=(textView)itemView.findViewById(R.id.textView);
imageArrow=(ImageView)itemView.findViewById(R.id.image\u arrow);
}
}
私有类ViewHolder两个扩展RecyclerView.ViewHolder{
图像视图图像视图;
复选框检查照片;
ViewHolderTwo(查看项目视图){
超级(项目视图);
imageView=(imageView)itemView.findViewById(R.id.imageView);
checkPhoto=(复选框)itemviewbyd(R.id.check\u photo);
}
}
@凌驾
public int getItemViewType(int位置){
返回infos.get(position.getType();
}
私有布尔值归属(列表sendDatas,int pos){
字符串str=infos.get(pos.getLocation();
对于(int i=0;i
问题在于如何设置
OnClickListener

onBindViewHolder()
中,您可以编写如下内容:

tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ...
            LogUtil.e(position +"POS");
            ...
        }
};
这里的
位置是什么?它是传递给
onBindViewHolder()
的值,在插入项目之前,它是
3

要修复该行为,您应该在单击该项时对其位置执行实时查询。我面前没有IDE,但我相信这会起作用:

tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ...
            LogUtil.e(holder.getAdapterPosition() +"POS");
            ...
        }
};
holder.getAdapterPosition()
将在单击时而不是绑定时确定项目的位置