对scrollview嵌套listview说不(一)

转载请指明出处:http://blog.csdn.net/u010339039/article/details/49838665
今年刚毕业然后就和同学来到了深圳。平时工作也不是很累,偶尔还挺闲。就像找点什么事来做。又没有其他什么技能,就想到来自己写写技术博客,小弟才疏学浅,如果写的如果有问题,希望大家指出。

一.概述

以前写类似这样的界面的时候总是先想到的是使用scrollview嵌套一个listview然后肯定大家都看见的一样然后就是listview显示不完全了,最后就只有到网上找解决办法。
这里写图片描述
当然还是顺利的找到了解决办法:
一般还是两招:
第一招:算出listview总高度
这里写图片描述
第二招:和第一招类似,也就是将listview全部高度展开。
这里写图片描述
这两个方法都有一个弊端,就是一次将listview中的item一次性全部展开,然后listview的特性不复存在,如果里面要是有很多高清大图什么的,那简直就是卡出翔,所以不要强迫listview和scrollview在一起了。他们真的不合适。
演示效果:
这里写图片描述

二:解读

这里我也有两招:

  1. 使用当前博客这招:就是让listivew中有好几个adapter让每个adpater负责自己的item界面
  2. 使用NestedScrolling嵌套机制:下次博客就写这个了吧。(recyclerView+nestedScrollingChildparent )

1).下面就通过代码讲解一下(因为有源码,就不满屏的贴代码了):
AdapterAdapter中的属性

private List<ListAdapter> listAdatper;

一看就知道是干什么的吧。就是用来装adapter的集合。

因为是用来装其他adapter的是把,那么这个listview中的view肯定就不只一种了。那么当然就想到了getViewTypeCount这个方法,这个方法就是返回这个adapter共有多少个不同的view,然后配套的就是getItemViewType。

注意:getItemViewType 和getViewTypeCount都是返回的int类型的,getViewTypeCount的int必须比getItemViewType 的最大值要大,不然要报异常。

@Override
public int getItemViewType(int position) {
    int offset = 0;
    int result = 0;
    for (ListAdapter la : listAdatper) {
        int size = la.getCount();
        if (position < size) {
            result = offset + la.getItemViewType(position);
            break;
        }
        position -= size;
        offset += la.getViewTypeCount();
    }
    return result;
}
@Override
public int getViewTypeCount() {
    int total = 0;

    for (ListAdapter la : listAdatper) {
        total += la.getViewTypeCount();
    }
    return Math.max(total, 1);
}

后面添加了几个adapter用来测试:
Adapter1,Adpater2,Adapter3,前两个Adapter都只有一个view,而Adapter3有两个不同的view,详细的去看看代码吧,然后在AdapterAdapter还写了个可以直接可以添加view的方法,咦,AdapterAdapter这个适配器不是用来装Adapter的么?为什么能直接装view呢?所以写了个sackofviewsAdapter用来包装一下view,就不用为了添加一个view然后去写一大串的adapter了。

public class SackOfViewsAdapter extends BaseAdapter {

    private List<View> listView ;

    public SackOfViewsAdapter(List<View> list){
       this.listView = list;
    }

    @Override
    public int getViewTypeCount() {
        return listView.size();
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public int getCount() {
        return listView.size();
    }

    @Override
    public Object getItem(int position) {
        return listView.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        return listView.get(position);
    }
}

这个Adapter比较简单,也没有什么viewholder这些了。

 public void addView(View view){
            List<View> listView = new ArrayList<View>(1);
            listView.add(view);
            this.addAdpater(new SackOfViewsAdapter(listView));
            this.notifyDataSetChanged();
        }

在AdpaterAdapter 的addview这个方法中使用

源码下载

参考代码

加个好友共同学习(不是公众号):

这里写图片描述

因为小弟水平有限,如果有写的有问题,希望指出。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值