ScrollView嵌套ScrollView
来源:互联网 发布:魔兽世界数据库 编辑:程序博客网 时间:2024/06/05 05:37
原博客地址:
http://www.eoeandroid.com/thread-240709-1-1.html
大家好,众所周知,android 里两个相同方向的ScrollView是不能嵌套的,那要是有这样的需求怎么办?(这个需求一般都是不懂android的人提出来的)
难道就真的不能嵌套吗? 当然可以,只要你再写一个ScrollView,在里面做点脚,它就支持嵌套了。
目前做的这个只支持两个ScrollView嵌套,两个以上还有待改进,能套两个就已经能满足很多需求了,呵呵,另外现在只做了纵向scrollview的支持,横向的还没来的急做哦。
效果截图:
先上核心代码吧。代码里头我加了注释,方便大家阅读[mw_shl_code=java,true]
package com.sun.shine.study.innerscrollview.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView;
public class InnerScrollView extends ScrollView {
/**
*/
public ScrollView parentScrollView;
public InnerScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
private int lastScrollDelta = 0;
public void resume() {
overScrollBy(0, -lastScrollDelta, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);
lastScrollDelta = 0;
}
int mTop = 10;
/**
* 将targetView滚到最顶端
*/
public void scrollTo(View targetView) {
int oldScrollY = getScrollY();
int top = targetView.getTop() - mTop;
int delatY = top - oldScrollY;
lastScrollDelta = delatY;
overScrollBy(0, delatY, 0, getScrollY(), 0, getScrollRange(), 0, 0, true);
}
private int getScrollRange() {
int scrollRange = 0;
if (getChildCount() > 0) {
View child = getChildAt(0);
scrollRange = Math.max(0, child.getHeight() - (getHeight()));
}
return scrollRange;
}
int currentY;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (parentScrollView == null) {
return super.onInterceptTouchEvent(ev);
} else {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
// 将父scrollview的滚动事件拦截
currentY = (int)ev.getY();
setParentScrollAble(false);
return super.onInterceptTouchEvent(ev);
} else if (ev.getAction() == MotionEvent.ACTION_UP) {
// 把滚动事件恢复给父Scrollview
setParentScrollAble(true);
} else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
}
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
View child = getChildAt(0);
if (parentScrollView != null) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
int height = child.getMeasuredHeight();
height = height - getMeasuredHeight();
// System.out.println("height=" + height);
int scrollY = getScrollY();
// System.out.println("scrollY" + scrollY);
int y = (int)ev.getY();
// 手指向下滑动
if (currentY < y) {
if (scrollY <= 0) {
// 如果向下滑动到头,就把滚动交给父Scrollview
setParentScrollAble(true);
return false;
} else {
setParentScrollAble(false);
}
} else if (currentY > y) {
if (scrollY >= height) {
// 如果向上滑动到头,就把滚动交给父Scrollview
setParentScrollAble(true);
return false;
} else {
setParentScrollAble(false);
}
}
currentY = y;
}
}
return super.onTouchEvent(ev);
}
/**
* 是否把滚动事件交给父scrollview
*
* @param flag
*/
private void setParentScrollAble(boolean flag) {
parentScrollView.requestDisallowInterceptTouchEvent(!flag);
}
}
以上是转发的的,下面是自己项目中写的并被实际项目中的写法
public class CustomListView extends ListView { public CustomListView(Context context) { super(context); } public CustomListView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override /** * 重写该方法、达到使ListView适应ScrollView的效果 */ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }}xml文件:
最外层 com.scwang.smartrefresh.layout.SmartRefreshLayout
第二层:ScrollView
第三层和第四层 线性布局
最里层 是自己定义的listView
<com.view.CustomListView android:id="@+id/store_commodity_listview" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@color/line_color" android:dividerHeight="@dimen/line_height" android:focusable="true" android:listSelector="@drawable/list_item_selecter" android:overScrollMode="never" android:scrollbars="none"/>
阅读全文
0 0
- ScrollView嵌套ScrollView
- ScrollView嵌套ScrollView
- ScrollView嵌套ScrollView
- ScrollView嵌套ScrollView
- ScrollView如何嵌套ScrollView
- ScrollView嵌套ScrollView
- ScrollView嵌套Scrollview滑动冲突
- Android ScrollView 嵌套 ScrollView 滑动
- android ScrollView嵌套ListView
- ScrollView中嵌套ListView
- ScrollView中嵌套ListView
- ScrollView中嵌套ListView
- ScrollView嵌套 ListView
- ScrollView 嵌套gridview
- ScrollView嵌套ViewPager
- android ScrollView嵌套ListView
- ScrollView嵌套ListView解决办法
- ScrollView和ListView嵌套
- 多线程之ThreadLocal
- 第37届MPD软件工作坊厦门站,让开发少走弯路
- [LeetCode]--Tow Sum
- 恢复oracle中误删除drop掉的表
- 工具类:关于如何找到两个List数组中不同的数据的算法!
- ScrollView嵌套ScrollView
- 1016. 部分A+B (15)
- 关于复合字面量的使用问题
- 五、Spring Cloud 的 Hystrix 组件
- Java 聊天室的简单实现原理
- Eclipse一直building workspace问题解决归纳
- LeetCode 240. Search a 2D Matrix II
- 新手win10 安装ubuntu双系统
- 关于hash表(散列表)的简单整理