Android ListView中处理嵌套滑动问题,类似ScrollView嵌套ListView

前言

  • 最近笔者在友情客串去给一培训机构android培训生讲解android初级实际开发技巧中,就提到了这个问题.这里分享下,避免其他童鞋在处理类似的滑动嵌套上走同样的弯路.
  • 这里打算用两篇来讲解我们开发中常遇到listView和recyclerView在处理滑动嵌套的时候的最佳解决方案.

实现思路

  • 首先第一篇,是我们ListView.ListView相对于recyclerView处理相对要简单一些,因为ListView为我们提供了addHeadView()这个方法,只需要把listview之上的复杂布局全部作为headview填充到listview里面,listview之下的复杂布局全部作为footview填充到listview里面即可.这里给个具体的案例吧.

具体案例

Android ListView中处理嵌套滑动问题,类似ScrollView嵌套ListView_第1张图片

  • 这种评论加点赞的页面在任何一款APP里面都非常普遍,一般新手开发者中规中矩的按照scrollview+listview来实现,类似这样:
    Android ListView中处理嵌套滑动问题,类似ScrollView嵌套ListView_第2张图片
  • 这样做,其实也没有错,只需要对嵌套滑动点击事件进行拦截处理也可以达到效果,不过随着listview的item布局复杂化,你会发现该页面的滑动性能相当差.因此便有了我们下一步的优化.
    Android ListView中处理嵌套滑动问题,类似ScrollView嵌套ListView_第3张图片
  • 这种做法,无论headview的布局如何复杂,我们只需要暴露出对应的view在adapter里面的对外方法,供其在被调用的activity进行逻辑处理即可.及时嵌套多层的headview,我们也不怕担心数据填充混乱的问题,并且只需要由外到内的填充headview数据即可.
  • 这样无论headview和listview的item如何复制,且都不会影响滑动性能.可能说道这里,你应该明白了.接下来,让我们直接上源码把.

实现源码

  1. 把整个listview之上的复杂布局作为一个布局文件include到listview所在的父布局中.
  2. 重写listview控件,把该布局在该listview里面去addheadview();
headView = (LinearLayout) inflater.inflate(R.layout.max_pulllist_head, null);
/* * 因为本案例是带下拉刷新的listview,因此我们重写的时候,为了避免刷新的view显示出来, * 所以需要将headview的高度先measure出来,在将隐藏的高度减去这个高度 * 最后在addheadview到listview里面 */
        comment_imgView.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        contentHeight = comment_imgView.getMeasuredHeight();

        measureView(headView);
        headContentHeight = headView.getMeasuredHeight() - contentHeight;
//      headContentWidth = headView.getMeasuredWidth();

        headView.setPadding(0, -1 * headContentHeight, 0, 0);
        headView.invalidate();

        addHeaderView(headView, null, false);
  1. 最后就是暴露出headview的get和set方法,供其在外部调用,实现具体业务逻辑

源码下载

  • 是不是很简单呢?完整代码点此下载.http://download.csdn.net/detail/qq_28690547/9452247

你可能感兴趣的:(android,android,ListView,解决方案)