hi,大家好,研究完ScrollView嵌套ScrollView之后,本人突然又想研究ScrollView里嵌套ListView了。

如果还不知道ScrollView嵌套ScrollView是怎么实现的可以参考http://www.eoeandroid.com/thread-240709-1-1.html
在上篇文章当中其实我没有怎么把原理讲清楚,只是上了原代码,而其实ScrollView里套ScrollView和ScrollView里套ListView是同一个道理的。

按常理,ScrollView套ListView会存在两个问题:

1.里面的listView高度无法算出来,通常只能显示listview的其中一行
2.listview不能滚动

在解决问题一的时候,我在网上找了一大堆资料,怎么怎么让listview显示完整,终于被我找到一个帖子,能解决这个问题
http://blog.csdn.net/hitlion2008/article/details/6737459 
(同时我不小心搜到了我的"ScrollView嵌套ScrollView"贴子满天飞...在这里我拜托大家,转贴注明出处啊亲。。。。。)。
按照这个贴子我试了一下,虽然listview的高度出来了,但是存在两个问题:
a.还是只支持ScrollView滚动,listView不会滚动,因为listView的高度已经达到最大,它不需要滚动。
b.listview的优点就是能够复用listItem,如果把listView撑到最大,等于是没有复用listItem,这跟没用listView一样,省不了ui资源,那我还不如直接用linearlayout呢

要怎么才能支持外面的ScrollView和里面的ListView都能滚动呢?

想过很多办法,最终我还是把ScrollView套ScrollView的实现原理搬过来试试看,结果成功了。。。。

其实实现原理很简单ScrollView有一个方法requestDisallowInterceptTouchEvent(boolean);
这个方法是设置是否交出ontouch权限的,如果让外层的scrollview.requestDisallowInterceptTouchEvent(false);那么外层的onTouch权限会失去,这样里面的listview就能
拿到ontouch权限了,listView也就能滚了。
问题是:权限只有一个,要支持两个view都能滚动。这个就有点难实现了吧..

其实这个一点也不难,当手指触到listview的时候,让外面的scrollview交出权限,当手指松开后,外面的scrollview重新获得权限。这样ok了。

且看代码实现:
重写一个InnerListView 
extends ListView

InnerListView.java

@Override
    public 
boolean onInterceptTouchEvent(MotionEvent ev) {
        switch 
(ev.getAction()) {
            case 
MotionEvent.ACTION_DOWN:
                
setParentScrollAble(false);//当手指触到listview的时候,让父ScrollView交出ontouch权限,也就是让父scrollview 
停住不能滚动
                LogManager.d("onInterceptTouchEvent 
down");
            case MotionEvent.ACTION_MOVE:
                
LogManager.d("onInterceptTouchEvent move");
                break;
        
    case MotionEvent.ACTION_UP:
                
LogManager.d("onInterceptTouchEvent up");
            case 
MotionEvent.ACTION_CANCEL:
                
LogManager.d("onInterceptTouchEvent cancel");
               
 setParentScrollAble(true);//当手指松开时,让父ScrollView重新拿到onTouch权限
        
        break;
            default:
                break;
     
   }
        return super.onInterceptTouchEvent(ev);
    
}

/**
     * 是否把滚动事件交给父scrollview
     * 
     * @param 
flag
     */
    private void setParentScrollAble(boolean flag) {
     
  parentScrollView.requestDisallowInterceptTouchEvent(!flag);//这里的parentScrollView就是listview外面的那个scrollview
  
  
}

在这里我要提出的是,listview能滚动的前提是:当listview本身的高度小于listview里的子view。

如果在xml里让listview的高度为wrap_content,可能会出现问题,如:ListView的高度会变成跟子view 
的高度一样。

这里最好是让listView的高度固定,平时我们写listView布局的时候也是给一个固定值。如fill_parent或100dip

我写了一个参数叫maxHeight.设置listview的最大高度。是为了确保ListView的高度固定。

private int maxHeight;
    public int getMaxHeight() {
        return 
maxHeight;
    }
    public void setMaxHeight(int maxHeight) {
     
   this.maxHeight = maxHeight;
    }
@Override
    protected void 
onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO 
Auto-generated method stub
        if (maxHeight > -1) {
           
 heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, 
MeasureSpec.AT_MOST);
        }
        super.onMeasure(widthMeasureSpec, 
heightMeasureSpec);
        System.out.println(getChildAt(0));
    }

转载于 :http://www.eoeandroid.com/thread-246995-1-1.html

android之ScrollView里嵌套ListView(转)的更多相关文章

  1. [Android] (在ScrollView里嵌套view)重叠view里面的onTouchEvent的调用方法

    在我前面的自定义裁剪窗口的代码中,我把裁剪的view放在了大的scrollview里,这样就出现了程序只能触发scrollview,无法操作我的裁剪窗口.所以我加了那篇博客下面最后两段代码.其实我遇到 ...

  2. Android 解决ScrollView下嵌套ListView进页面不在顶部的问题

    以下为整理: 方法1 刚开始还可以,后来再调试时就不行了. 为了解决scrollview和listview冲突  设置了listview的高度   结果进页面就不是在顶部了 . 解决方案1:Scrol ...

  3. Android -- 在ScrollView中嵌套ListView

    在做一个工程,这个工程的布局可以相当的复杂,最外面是ScrollView,在ScrollView里面有两个Listview,这下好了,布局出来了,放在机子上跑,卡得想死有木有,信息乱跑乱出现,表示非常 ...

  4. Android 如何在ScrollView中嵌套ListView

    前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListVie ...

  5. Android实战技巧:如何在ScrollView中嵌套ListView

    前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListVie ...

  6. RecyclerFullyManagerDemo【ScrollView里嵌套Recycleview的自适应高度功能】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 对于Recyclerview自己的LinearLayoutManager和GridLayoutManager,在版本23.2.0之后 ...

  7. ScrollView中嵌套ListView的问题

    网上关于怎样在ScrollView中嵌套ListView的讨论有很多,我大概是搜索了一下,简单总结如下: 1.不要在ScrollView中嵌套ListView a.用一个LinearLayout来代替 ...

  8. ScrollView中嵌套ListView时,listview高度显示的问题

    方法一:直接更改listview的控件高度,动态获取(根据条目和每个条目的高度获取) 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个Lis ...

  9. Android ScrollView中嵌套ListView

    由于要做一个相似美团的团购产品.scrollview中还有嵌入listview,要是直接把listview嵌进scrollview中.listview的高度是固定的不能进行滑动.默认情况下Androi ...

随机推荐

  1. Problem A: 英雄无敌3(1)【dp/待补】

      Problem A: 英雄无敌3(1) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 86  Solved: 16[Submit][Status][ ...

  2. 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409904.html 普瑞姆(Prim)算法: 假设N = (V, {E})是连通网,TE是N上最小生成树边的集合,U是是 ...

  3. 2016noipday1t1玩具迷题结题报告

    经常读这个代码有益于比赛时想起一些思路.... day1t1,洛谷dalao称之为水题...??然后我去年还是没拿到分,就这个,我还就写了40%的数据,AC到40,然而这不是关键,注释了freopen ...

  4. 数据库的语言——SQL

    DBMS 是一种系统软件,我们要与它交互的时候就必须使用某种语言,在数据库发展初期每一种DBMS 都有自己的特有的语言,不过逐渐的SQL 成为了所有DBMS 都支持的主流语言.SQL 是专为数据库而建 ...

  5. JVM的参数配置

    JVM管理的内存叫堆.在32Bit操作系统上有1.5G-2G的限制,而64Bit的就没有. JVM初始分配的内存由-Xms指定,默认是物理内存的1/64但小于1G. JVM最大分配的内存由-Xmx指定 ...

  6. 【莫比乌斯反演+分块】BZOJ1101-[POI2007]Zap

    [题目大意] 对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. [思路] 前面的思路同HDU1695 不过不同的是这道题中(a,b)和(b ...

  7. 1.1(Mybatis学习笔记)初识Mybatis

    一.Mybatis下载与使用 下载地址:https://github.com/mybatis/mybatis-3/releases 下载后解压目录: 需要将lib下的jar包和mybatid-x-x- ...

  8. CodeForces - 44A Indian Summer

    Indian summer is such a beautiful time of the year! A girl named Alyona is walking in the forest and ...

  9. Mybatis更新用户

    xml配置 <!--更新用户 --> <update id="updateUserById" parameterType="com.itheima.my ...

  10. 设置MySQL数据库名不区分大小写

    Linux下的MySQL默认是区分表名大小写的,通过如下设置,可以让MySQL不区分表名大小写: 1.用root登录,修改 /etc/my.cnf: 2.在[mysqld]节点下,加入一行: lowe ...