android之ScrollView里嵌套ListView(转)

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));
    }

时间: 2024-12-18 13:44:06

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

Android之ScrollView里嵌套ListView

ScrollView套ListView会存以下两个问题 1.里面的listView高度无法算出来,通常只能显示listview的其中一行 2.listview不能滚动 这里我用的是可展开的(ExpandableListView 解决问题一,如果ExpandableListView是的子项是用写死的布局文件来加载的,只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中.但是要注意的是,子ListView的每个Item必

ScrollView里嵌套ListView的冲突问题

这是最近遇到的一个问题,要在详情页面添加别人评论的,详情页面本身有很多信息,不能再一屏展示完所以用了ScrollView,由于评论有很多条所以这时候自然就用到ListView来展示,但是遇到了问题那就是ScrollView里的ListView只能显示一个条目.试过好几个方法来解决这个问题,最终找到了最简单的.自定义实现ListView. public class ListviewNoScroll extends ListView { public ListviewNoScroll(Context

Android -- 在ScrollView中嵌套ListView

在做一个工程,这个工程的布局可以相当的复杂,最外面是ScrollView,在ScrollView里面有两个Listview,这下好了,布局出来了,放在机子上跑,卡得想死有木有,信息乱跑乱出现,表示非常头疼. 在网上百度之后,发现有人解决了这个问题,便把这个解决方案转载过来分享一下. 它的思路就是在设置完ListView的Adapter后,根据ListView的子项目重新计算ListView的高度,然后把高度再作为LayoutParams设置给ListView,这样它的高度就正确了. public

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

前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题.上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计算的. 又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经过

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

方法一:直接更改listview的控件高度,动态获取(根据条目和每个条目的高度获取) 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题.上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计

笔记整理1_1:解决在ScrollView中嵌套ListView不能显示全部item的问题

package com.example.scrollview; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import com.pb.custo

解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题

在一个滑动控件或者是布局里面,添加另外一个可以滑动的控件,通常会造成一些莫名其妙的问题.今天主要介绍在工作中遇到的,在ScrollView布局中嵌套Listview显示不正常,和在Listview中嵌套Listview的滑动冲突的问题. 1.ScrollView布局中嵌套Listview显示不正常的解决方案 目前来说,解决这个问题有好几种解决方案,这里只介绍其中两种比较简单易行的其中两种. (1)自定义一个Listview,继承自Listview,代码如下: public class ListV

解决ScrollView下嵌套ListView、GridView显示不全的问题(冲突)

原文地址:http://blog.csdn.net/cs_li1126/article/details/12906203 一.使用网上用的动态改变listview高度的方法,该方法只适用于item布局是LinearLayout布局的情况,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常.所以使用限制较大. [java] view plaincopy public class Utility { publ

scrollview里面嵌套listview的坑

scrollview里面嵌套listview是一种很不好的做法,最好还是使用一个listview,将其他需要滑动的部分添加为头布局脚部局,或者在adapter里面将头脚用一个标志位去判断作为单独的item,这样性能是最完好的,不容易出现bug. 当然了,难免有人会用到的,会出现只显示一个item的bug,解决办法有两种.一种是自定义一个WrapContentListview,很简单的继承自Listview,只需要重写OnMeasure方法 public class WrapContentList