如图所示,在ListView嵌套GridView时出现了奇葩现象,求大神指教!

解决方案 »

  1.   

    你断点调试,看看ListView加载第一个item的流程是否正常
      

  2.   

    现在断点只能看到ListView的getView被多次重复调用,我在给GridView设置适配器时,使用了一个handle延迟,确保流畅加载;这个延迟去掉或者不去掉,liatview的getView方法一样被多次调用,例如有5条数据,getView会有多次重复的position=0,1,2,3,4的重复
      

  3.   

    参考这个https://www.jb51.net/article/126601.htm
    另外RecyclerView是支持android4.x的
      

  4.   

    一直以为recycleView是5.1才出的正式版呢,所以5.1之前我都在避免使用,非常感谢提醒!另外,我的listview的宽高都是match_parent,我当前的listview在适配的时候,是在listview的getview中根据源数据的类型进行对convertView的动态宽高设置,同时也对convertview里包含的gridview进行了一个宽高的动态设置并适配gridview,listview正常复用convertView的时候,listview的第一条数据无法正常适配,当我去掉listview的convertview的复用的时候,数据适配就正常了,不知道到底是什么原因导致的
      

  5.   

    你把你复用convertview和去掉convertview复用的代码片段贴出来,对比看看
      

  6.   

    重写gridview ,链接在这 https://blog.csdn.net/yuyan13419694540/article/details/51143223
      

  7.   

    listview的getiview中区分两种item类型,做两种处理,断点可以看出返回的item类型是正确的
    public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    switch (getItemViewType(position)) {
    case 0:
    count=position;
    return handleGoodsView(position,convertView,parent);
    case 1:
    count=position;
    return handleCateView(position,convertView,parent);
    default:
    return convertView;
    }
    }
    handleGoodsView的部分代码,convertview的复用部分,这个复用目前我已经注掉了
    private View handleGoodsView(final int position, View convertView, ViewGroup parent) {
            final LifeFloorInfo item = floorInfo.get(position);//某一个楼层
    final ArrayList<LifeFloorGoods> detailGoods = floorInfo.get(position).getGoodsList();//type==1时,楼层的商品集合
    final ViewHolder holder ;
    mesureconvertView(listView, DeviceUtil.dip2px(context, getConvertViewOff(95)));
    // if (convertView == null) {
    convertView = LayoutInflater.from(context).inflate(
    R.layout.fd_life_floor_item, parent,false);
    holder = new ViewHolder();
    holder.setTag("1");
    holder.FloorName = (TextView) convertView.findViewById(R.id.FloorName);
    // holder.FloorId = (TextView) convertView.findViewById(R.id.FloorId); // holder.Url = (ImageView) convertView.findViewById(R.id.Url);
    holder.gridview=(GridView)convertView.findViewById(R.id.gridView1);
    holder.more_tv=(TextView)convertView.findViewById(R.id.mall_home_detail);
    // holder.view=(RecyclerView)convertView.findViewById(R.id.id_recyclerview_horizontal); convertView.setTag(holder);
    // }
    // else {
    // holder = (ViewHolder) convertView.getTag();
    // }
    holder.FloorName.setText(item.getFloorName());
                   mesureconvertView(convertView, DeviceUtil.dip2px(context, getConvertViewOff(95)));//动态设置convertview的宽高
    horizontal_layout(holder.gridview,DeviceUtil.dip2px(context, 60),detailGoods.size());//设置gridview为横向布局以及gridview的宽度及高度
                    holder.gridview.setAdapter(new LifeFloorGoodsDetailAdapter(context,detailGoods));//适gridview的内部数据
                  
                 设置监听之类的代码就没有粘贴出来了
    }
    handleCateView的代码与handleGoodsView的代码类似以上如果放开convertview的复用,是在适配出现问题的后来我尝试了一种写法,把复用放开后就没问题了。
    就在list view的getview的一开始就增加一个判断
    if (convertView!=null&&position>listView.getLastVisiblePosition())
    return  convertView;
    然后再走swichcase的步骤,然后就正常适配数据了,其它的都没有改动,现在还不知道是什么原因,但listview的第一条中的gridview现在已经正常适配了,有没有大神知道是什么原理,我就是随便试试那个判断的,也不知道怎么就好了。