package demo.com.listviewinscrollview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.AbsListView;
import android.widget.ListView;
/**
* Created by Alv_chi on 2016/12/6.
*/
public class MyListView extends ListView implements AbsListView.OnScrollListener {
private static final String TAG = "MyListView";
private MyScrollView myScrollView;
private boolean isPullup;
private int svCurrentYPosition;
private boolean isLastItem = false;
private boolean isEndOfListView = false;
private boolean isFirstItem = false;
private float downY;
private float moveY;
private boolean isStartOfListView = false;
public MyListView(Context context) {
this(context, null);
}
public MyListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public MyListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
setOnScrollListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
moveY = ev.getY();
break;
}
// 用于判断手指是向上滑动还是向下滑动;
isPullup = downY > moveY ? true : false;
return super.onTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int lvTop = getTop();
int height = getHeight();
height += lvTop;
lvTop -= 10;
// 此处获取ScrollView对象,也可以用Setter方法set进来;
myScrollView = (MyScrollView) (getParent().getParent());
if (myScrollView != null) {
svCurrentYPosition = myScrollView.getcurrentYPosition();
Log.e(TAG, "onTouchEvent: svCurrentYPosition=" + svCurrentYPosition);
}
// 当LIstView到达屏幕顶部时(一定范围内),不让其父ScrollView拦截,
// 也就是让ListView去滚动(消费),超出范围就拦截ScrollView滚动(消费);
if (svCurrentYPosition < height && svCurrentYPosition > lvTop) {
// 判断是否listVIew划到两端的尽头,如果是就让ScrollView截断事件,让ScrollVIew滚动,而不是ListVIew滚动;
if ((isEndOfListView && isPullup) || (isStartOfListView && !isPullup)) {
myScrollView.requestDisallowInterceptTouchEvent(false);
} else {
myScrollView.requestDisallowInterceptTouchEvent(true);
}
} else {
myScrollView.requestDisallowInterceptTouchEvent(false);
}
return super.dispatchTouchEvent(ev);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE && isLastItem) {
isEndOfListView = true;
} else {
isEndOfListView = false;
}
if (scrollState == SCROLL_STATE_IDLE && isFirstItem) {
isStartOfListView = true;
} else {
isStartOfListView = false;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
isLastItem = (firstVisibleItem + visibleItemCount == totalItemCount);
isFirstItem = firstVisibleItem == 0 ? true : false;
}
}
ScrollView嵌套ListVIew两者之间滑动问题
需积分: 9 186 浏览量
2016-12-06
20:59:40
上传
评论
收藏 40KB ZIP 举报
ALv_chi
- 粉丝: 0
- 资源: 11