listview在scrollview中自行滑动(滑动冲突)

我们在文章解决ListView在ScrollView里只显示单行的问题中解决了单行显示的问题,同时又在文章点击加载更多(适用于listview在scrollview单行显示修正后多数据加载慢的情况)中解决了多条数据重测量设置高度耗资源卡顿的问题。

那么有人说了,我的scrollview里面的元素较多,不想直接在scrollview里面全部显示出listview,太占界面大小了,要不然我得滑倒天荒地老才能看见listview下面的控件啊!我只想在高度限制的一块区域显示(自定义xml中高度dip,或代码设置几条item的高度文章1、2都有实现),用户想滑那就让他自己滑listview去,想看下面的元素就滑动scrollview。

可有个问题,系统怎么判断我是滑动的listview还是scrollview呢(listview在scrollview里啊)?系统默认是将滑动事件交给scrollview处理,因为scrollview和listview都是可滑动的,而scrollview是父view,会拦截滑动事件自己实现。

这时候就要重写listview了,在它的dispatchTouchEvent方法里面将父view(这里就是scrollview)的InterceptTouchEvent给设置为false,就是不让父view去拦截触摸事件,直接交给子view(就是listview)处理,这样我们滑动的时候系统就认为我们是滑动listview而不是scrollview了(也就实现在限制的区域内滑动listview,不然的话会直接滑倒下面的控件,listview只显示前几条)

实现代码:

public class MyListView extends ListView  
{
	public MyListView(Context context) {
		super(context);
	}  
	
	public MyListView(android.content.Context context,android.util.AttributeSet attrs){
		super(context, attrs);
	}
	
	
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		// TODO Auto-generated method stub
		getParent().requestDisallowInterceptTouchEvent(true);//这句话的作用 告诉父view,我的单击事件我自行处理,不要阻碍我。
		return super.dispatchTouchEvent(ev);
	}
}

在实现中需注意,如果listview的一部分在scrollview可显示区域的最下方时(就是说上面的元素把listview的一部分或全部“挤出屏幕”),如图:(待补充)

或许你可以通过滑动上面的元素将listview显示区域的下边界露出来,因为这时的情况只能是listview显示区域小于scrollview在屏幕中占的位置,一旦listview显示高度大于scrollview在手机界面中占有的高度时,如图:(待补充);就只能一直滑动listview了(界面中最下方的区域一直是listview的范围,没办法滑倒下一个控件了),如图:(待补充)

有一个解决方法是将listview的宽度设置小于scrollview的宽度,那么你滑动listview“以外”左右两边的scrollview“竖条区域”就可以了,我在掘金的帖子详情里面看到这种效果了(不过控件不是我们说的这两个),效果见图:(待补充)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值