背景: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