android之ScrollView里嵌套ListView(都可滚动)

http://www.eoeandroid.com/thread-246995-1-1.html


其实实现原理很简单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
    }



有些设备上,依然不响应。则修改ScrollView。

public class ScrollScrollView extends ScrollView {


    GetListViewPos getPos;
    public ScrollScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if(getPos != null){
                int scrollY = getScrollY();
                int listTop = getPos.getTop() - scrollY;
                int listBtm = getPos.getBottom() - scrollY;
                int listLeft = getPos.getLeft();
                int listR = getPos.getRight();
                int y = (int) ev.getY();
                int x = (int) ev.getX();
                if(x > listLeft && x < listR && y > listTop && y < listBtm){
                    requestDisallowInterceptTouchEvent(true);
                    return false;
                }
            }
        case MotionEvent.ACTION_MOVE:
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            break;
        default:
            break;
        }
        boolean retn = super.onInterceptTouchEvent(ev);
        return retn;
    }
    
    public static interface GetListViewPos{
        int getTop();
        int getBottom();
        int getLeft();
        int getRight();
    }


    public void setGetListViewPos(GetListViewPos getListViewPos) {
        getPos = getListViewPos;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值