为了账号安全,请及时绑定邮箱和手机立即绑定

计算realPosition的问题

int realPosition= position - mPositions.get(viewType); 

如果position为0, mPositions根据当前类型获取的集合的长度,  它们一减,肯定是一个负数啊,为什么在下面List直接使用没有报索引越界, 

正在回答

4 回答

我自己写了个demo,那个方法是:

private void addTypeByList(int type, List list) {
   positions.put(type, types.size());
   for (int i = 0; i < list.size(); i++) {
       types.add(type);
   }
}

因为第一次加list1的时候,types.size()=0,所以不会出现负数的情况。

1 回复 有任何疑惑可以回复我~

有了个可以兼容数据长度的方法

private List<Object> allList = new ArrayList<>();

在构造方法中或者在add方法中

allList.addAll(dataListOne);
allList.addAll(dataListTwo);
allList.addAll(dataListThree);

在onBindViewHolder方法中

int realPosition = 0;
Object object = allList.get(position);
if(object instanceof DataModelOne){
   for (int i=0;i<dataListOne.size();i++){
       if(object == dataListOne.get(i)){
           realPosition = i;
       }
   }
}else if(object instanceof DataModelTwo){
   for (int i=0;i<dataListTwo.size();i++){
       if(object == dataListTwo.get(i)){
           realPosition = i;
       }
   }
}else if(object instanceof DataModelThree){
   for (int i=0;i<dataListThree.size();i++){
       if(object == dataListThree.get(i)){
           realPosition = i;
       }
   }
}

这样就能拿到realPosition的位置了

0 回复 有任何疑惑可以回复我~

if(position<10){
   realPosition = position - mPosition.get(viewType) +10;
}else if(position>=10 && position<20){
   realPosition = position - mPosition.get(viewType);
}else{
   realPosition = position - mPosition.get(viewType) -10;
}

这样可以解决,但是这个方法太局限了,我再找个好点的方法

0 回复 有任何疑惑可以回复我~

我这边写的时候,一直是越界的,老师写的时候我就觉得这里肯定有问题,但是不知道为什么,老师能运行起来

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
不一样的RecyclerView优雅实现复杂列表布局
  • 参与学习       19287    人
  • 解答问题       32    个

教你更快捷简单的实现复杂列表布局,快来掌握她吧,她等着你哦

进入课程

计算realPosition的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信