600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > android之ScrollView里嵌套ListView(转)

android之ScrollView里嵌套ListView(转)

时间:2021-09-26 09:35:16

相关推荐

android之ScrollView里嵌套ListView(转)

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

如果还不知道ScrollView嵌套ScrollView是怎么实现的可以参考/thread-240709-1-1.html

在上篇文章当中其实我没有怎么把原理讲清楚,只是上了原代码,而其实ScrollView里套ScrollView和ScrollView里套ListView是同一个道理的。

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

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

2.listview不能滚动

在解决问题一的时候,我在网上找了一大堆资料,怎么怎么让listview显示完整,终于被我找到一个帖子,能解决这个问题

/hitlion/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));

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。