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()
将在单击时而不是绑定时确定项目的位置