解决ScrollView+ViewPager+ListView/RecyclerView,及ScrollVIew滑动监听
2018-01-12 11:19
351 查看
有一个需求是这样,在ScrollView下有一个Viewpager,ViewPager中又会有ListView或者RecyclerView,要整体滑动,同时监听ScrollView的滑动。
可以监听滑动的ScrollView:
使用:
根据item高度自适应的ViewPager:
完全展开的ListView:
RecyclerView相对简单直接设置
就可解决滑动冲突
问题就这样解决了 , 方法可能略显笨重
感谢 : http://blog.csdn.net/weixin_36924912/article/details/76590958
可以监听滑动的ScrollView:
public class ObservableScrollView extends ScrollView { public interface OnScrollViewListener { void onScrollChanged(int x, int y, int oldx, int oldy); } private OnScrollViewListener onScrollViewListener = null; public ObservableScrollView(Context context) { super(context); } public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ObservableScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setOnScrollViewListener(OnScrollViewListener onScrollViewListener) { this.onScrollViewListener = onScrollViewListener; } @Override protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if (onScrollViewListener != null) { onScrollViewListener.onScrollChanged(x, y, oldx, oldy); } } }
使用:
observableScrollView.setOnScrollViewListener(new ObservableScrollView.OnScrollViewListener() { @Override public void onScrollChanged(int x, int y, int oldx, int oldy) { } });
根据item高度自适应的ViewPager:
/** * 根据View的内容自动适应高度的ViewPager */ public class AutofitViewPager extends ViewPager { private static final String TAG = "AutofitViewPager"; public AutofitViewPager(Context context) { this(context, null); } public AutofitViewPager(Context context, AttributeSet attrs) { super(context, attrs); addOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { requestLayout(); } @Override public void onPageScrollStateChanged(int state) { } }); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); Log.d(TAG, "onMeasure"); // find the current child view View view = getChildAt(getCurrentItem()); if (view != null) { // measure the current child view with the specified measure spec view.measure(widthMeasureSpec, heightMeasureSpec); } setMeasuredDimension(getMeasuredWidth(), measureHeight(heightMeasureSpec, view)); } /** * Determines the height of this view * * @param measureSpec A measureSpec packed into an int * @param view the base view with already measured height * @return The height of the view, honoring constraints from measureSpec */ private int measureHeight(int measureSpec, View view) { int result = 0; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { result = specSize; } else { // set the height from the base view if available if (view != null) { result = view.getMeasuredHeight(); } if (specMode == MeasureSpec.AT_MOST) { result = Math.min(result, specSize); } } return result; } }
完全展开的ListView:
public class SpreadListView extends ListView { public SpreadListView(Context context) { super(context); } public SpreadListView(Context context, AttributeSet attrs) { super(context, attrs); } public SpreadListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int newHeightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, newHeightSpec); } }
RecyclerView相对简单直接设置
.setNestedScrollingEnabled(false);
就可解决滑动冲突
问题就这样解决了 , 方法可能略显笨重
感谢 : http://blog.csdn.net/weixin_36924912/article/details/76590958
相关文章推荐
- 解决ScrollView嵌套viewPager中嵌套listView滑动事件冲突问题(水平方向)
- 监听滑动事件和消除与内嵌recyclerview冲突的Scrollview(惯性消失问题解决)
- 使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种滑动冲突
- 安卓解决viewPager+scrollView+listView滑动冲突的问题
- 解决ViewPager横向的ViewGroup滑动冲突的问题,例如HorizontalListView,RecyclerView,各种layout等
- 安卓解决viewPager和scrollView和listView滑动冲突的问题
- 解决ScrollView与RecyclerView/ListView滑动冲突的两种方法
- Android自定义View之ScrollViewforListView(解决ScrollView嵌套listview,listview不能滑动)
- 使用NestedScrollView+ViewPager+RecyclerView+SmartRefreshLayout打造酷炫下拉视差效果并解决各种滑动冲突
- 解决ScrollView或者listview嵌套ViewPager 时候 Pager左右滑动不流畅
- ScrollView、SwipeRefreshLayout、ListView、RecyclerView等控件解决滑动冲突
- 一个 ScrollView 里面包含 viewpager 嵌套 listview 或 RecyclerView 极少代码实现的流畅滑动效果 处理一个两层滑动 view 的自定义布局,以最少的代码实现,
- Android滑动冲突解决方式(下拉刷新上拉加载更多,适配RecyclerView/ListView/ScrollView)
- ScrollView、SwipeRefreshLayout、ListView、RecyclerView等控件解决滑动冲突
- NestedScrollView中嵌套ViewPager或RecyclerView出现滑动冲突的解决
- 禁用滚动视图ListView、ViewPager、ScrollView、HorizontalScrollView、WebView边界颜色渐变
- 简单完美解决PullToRefreshLayout中PullableListView嵌套ViewPager时滑动冲突的问题
- 自定义viewpager解决listview和viewpager滑动冲突的问题
- 完美解决viewpager跟其他类型的listview 或 gridview一起使用时,滑动冲突问题
- Android 解决 ScrollView 嵌入 HorizontalScrollView 后滑动卡顿问题