ScrollView嵌套SwipeMenuListView焦点问题

    背景:SwipeMenuListView大家都是比较常用的,是类似于QQ左滑删除ListView的item,但是为了某些用户体验上,不得以把SwipeMenuListView放入在ScrollView里面,但是在一些处理之后,还是会出现焦点事件问题,比如滑动不太好使,或者上下滑动不好使等问题,最后我通过事件分发传递才解决这个问题,只能说做到了最好的优化 ,微微有些瑕疵,不过还好影响不大。得意

   SwipeMenuListView的github:https://github.com/baoyongzhang/SwipeMenuListView

  上图:

  

   1,处理ScrollView嵌套listView高度问题最常见的,首先自定义一个SwipeListView 去继承SwipeMenuListView然后重写onMeasure计算高度嘛。

   

public class SwipeListView extends SwipeMenuListView {
    public SwipeListView(Context context) {
        super(context);
    }

    public SwipeListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public SwipeListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}
   2,在根据官方使用方法step1,2,3使用之后,就是在Activity中处理他们的焦点问题,这个焦点就是再左滑的时候这个事件很容易被ScrollView给拦截,导致滑不出来。

   我滑动半天可能才滑出来,然后点击事件有时候又不好使,如果再处理左右事件之后呢,上下滑动又不好使了,要半天才能滑动。如果你的是这种情况,那你就来对了。

  处理方法:看源码

  给listView添加OnTouchListenter监听处理横向和纵向

private int localWigth = 0;     private int localHeigth = 0;

listView.setOnTouchListener(new View.OnTouchListener() {   
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

                switch(motionEvent.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        localWigth = (int)motionEvent.getX();
                        localHeigth = (int)motionEvent.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int sx = (int)motionEvent.getX();
                        int sy = (int)motionEvent.getY();
                        if (localWigth - sx > 10 || localWigth - sx < 10) {  //重点就是来判断横向或者纵向滑动的距离来分配焦点
                            scrollview.requestDisallowInterceptTouchEvent(true);  //拦截ScrollView的事件,让listView能滑动
                        }else {
                            scrollview.requestDisallowInterceptTouchEvent(false);   //取消ScrollView的拦截事件,让listView不能滑动
                        }
                        if (localHeigth - sy >= 80 || localHeigth - sy < -80){
                            scrollview.requestDisallowInterceptTouchEvent(false);
                        }else {
                            scrollview.requestDisallowInterceptTouchEvent(true);
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                   
                        localWigth = 0;
                        localHeigth= 0;
                        break;
                }
                return false;
            }
        });
通过以上方法,我其实处理的差不过了,不过有点没中不足的是,在很小的几率下,左右滑动还是会有焦点分配错误的情况是在即在左滑又在上滑且上滑超过50的时候会出现这个问题,但是几率很少,基本是不影响的。

费了今天半天的劲终于解决这个问题了。

可以好好睡觉了~


纪实:2016-9-12


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值