博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android之ScrollView里嵌套ListView(转)
阅读量:5788 次
发布时间:2019-06-18

本文共 2628 字,大约阅读时间需要 8 分钟。

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

如果还不知道ScrollView嵌套ScrollView是怎么实现的可以参考
在上篇文章当中其实我没有怎么把原理讲清楚,只是上了原代码,而其实ScrollView里套ScrollView和ScrollView里套ListView是同一个道理的。
按常理,ScrollView套ListView会存在两个问题:
1.里面的listView高度无法算出来,通常只能显示listview的其中一行
2.listview不能滚动
在解决问题一的时候,我在网上找了一大堆资料,怎么怎么让listview显示完整,终于被我找到一个帖子,能解决这个问题
(同时我不小心搜到了我的"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));
    }

 

转载于 :

你可能感兴趣的文章
[Cocos2d-x For WP8]矩形碰撞检测
查看>>
自己写spring boot starter
查看>>
花钱删不完负面消息
查看>>
JBPM之JPdl小叙
查看>>
Membership三步曲之进阶篇 - 深入剖析Provider Model
查看>>
前端优化及相关要点总结
查看>>
struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
查看>>
25 个精美的手机网站模板
查看>>
C#反射实例应用--------获取程序集信息和通过类名创建类实例
查看>>
VC中实现文字竖排的简单方法
查看>>
会话标识未更新
查看>>
阿里架构师:程序员必须掌握的几项核心技术能力
查看>>
程序员常用的六大技术博客类
查看>>
Iceworks 2.8.0 发布,自定义你的 React 模板
查看>>
胖哥学SpringMVC:请求方式转换过滤器配置
查看>>
Kotlin 更加优雅的 Builder - 理解 with
查看>>
前端日拱一卒D6——字符编码与浏览器解析
查看>>
深入理解浏览器的缓存机制
查看>>
微软向Linux社区开放60000多项专利:对开源微软是认真的
查看>>
Hoshin Kanri在丰田的应用
查看>>