问答详情
源自:3-2 RecyclerView优雅实现下半段

计算realPosition的问题

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

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

提问者:三年約束努力 2016-11-09 20:41

个回答

  • 泛岁月的涟漪
    2016-11-20 21:55:47

    我自己写了个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,所以不会出现负数的情况。

  • 凡人不羡仙
    2016-11-10 15:08:30

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

    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的位置了

  • 凡人不羡仙
    2016-11-10 02:34:48

    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;
    }

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

  • 凡人不羡仙
    2016-11-10 02:27:38

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