Android中ScrollView与listView冲突以及ScrollView与listView无法滑动(拖动)解决办法

应用场景:ScrollView 套 Listview

一、 冲突显现:

当listview 高度设置为wrap_content时,实际效果是 listview 只显示一条item多一点点,且不能滑动,

出现该现象的原因是:

listview在渲染界面的时候,它不知道自己的整个高度是多少,所以默认自己搞了一条;

不能滑动的问题下面会说。

对listview的设置如下:

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="5dp"
    android:fillViewport="true"
    android:dividerHeight="5dp" />
处理方案:
	通过代码计算出每一个item的高度,以及分割线的总高度,设置为listview的高度,
	这样,listview全部显示出来了,但是只能scrollview滑动
代码如下:
public void setListViewHeightBasedOnChildren(ListView listView) {    
        ListAdapter listAdapter = listView.getAdapter();     
        if (listAdapter == null) {    
            return;    
        }    
    
        int totalHeight = 0;    
        for (int i = 0; i < listAdapter.getCount(); i++) {    
            View listItem = listAdapter.getView(i, null, listView);    
            listItem.measure(0, 0);    
            totalHeight += listItem.getMeasuredHeight();    
        }    
    
        ViewGroup.LayoutParams params = listView.getLayoutParams();    
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));    
        params.height += 5;//上面的分割线设置为5dp,所以这里每次加5个像素   
        listView.setLayoutParams(params);    
    }    
二、listview固定高度,listview显示不全,且listview部分不能滑动
	当我们给listview固定高度时,listview能渲染出多个item,但是问题来了,还是不能滑动。
	代码实例:
<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="5dp"
    android:fillViewport="true"
    android:dividerHeight="5dp"
/>
      为什么会这样呢?
	原因是这样的:scrollview要滑动,listview也要滑动,那么View的事件分发的时候就出现了冲突了;当手指放在屏幕上的时候,因为外层的是scrollview,
		    所以View默认把滑动的事件给了scrollview,listview没有触发滑动的事件;但是当用A、B两个手指先后按在listview上滑动的时候,listview
		    是能动的,但是很不流畅,这一现象说明:两个手指获取焦点的时候View把获取焦点的事件给了listview。
	好,那现在问题都出来了,那就好办了,我们对listview进行获取焦点的监听,当listview获得触摸焦点的时候,让srcollview的触摸事件消失:
listView.setOnTouchListener(new View.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_MOVE) {
            scrollView.requestDisallowInterceptTouchEvent(true);
        }
        return false;
    }
});
最后的总结与建议:
	当前问题是解决了,但是在用户体验上,android这边没有IOS的那么流畅,Google官方也不提倡ScrollView 套 Listview这样搞,但是当遇到不懂技术的
	产品经理要这样干:外层要滑动,里层也要滑动的时候,就只能这么干了。

	

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值