解决ScrollView嵌套ViewPager,导致ViewPager不能滑动的问题

import java.lang.reflect.Field;

import java.lang.reflect.Method;

/**

* 解决ScrollView嵌套ViewPager,导致ViewPager不能滑动的问题

*/

public
class CustomScrollView extends ScrollView {

private GestureDetector
mGestureDetector;

private
int
Scroll_height = 0;

private
int
view_height = 0;

protected Field
scrollView_mScroller;

private
static final String
TAG =
"CustomScrollView";

public CustomScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

mGestureDetector =
new GestureDetector(context,
new YScrollDetector());

setFadingEdgeLength(0);

}

@Override

public
boolean onInterceptTouchEvent(MotionEvent ev) {

if (ev.getAction() == MotionEvent.ACTION_DOWN) {

stopAnim();

}

boolean ret =
super.onInterceptTouchEvent(ev);

boolean ret2 =
mGestureDetector.onTouchEvent(ev);

return ret && ret2;

}

class YScrollDetector
extends SimpleOnGestureListener {

@Override

public
boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX,
float distanceY) {

if (Math.abs(distanceY) > Math.abs(distanceX)) {

return
true;

}

return
false;

}

}

@Override

protected
void onScrollChanged(int l,
int t,
int oldl, int oldt) {

boolean stop =
false;

if (Scroll_height -
view_height == t) {

stop = true;

}

if (t == 0 || stop ==
true) {

try {

if (scrollView_mScroller ==
null) {

scrollView_mScroller =
getDeclaredField(this,
"mScroller");

}

Object ob = scrollView_mScroller.get(this);

if (ob ==
null || !(ob
instanceof Scroller)) {

return;

}

Scroller sc = (Scroller) ob;

sc.abortAnimation();

} catch (Exception e) {

Log.e(TAG, e.getMessage());

}

}

super.onScrollChanged(l, t, oldl, oldt);

}

private
void stopAnim() {

try {

if (scrollView_mScroller ==
null) {

scrollView_mScroller =
getDeclaredField(this,
"mScroller");

}

Object ob = scrollView_mScroller.get(this);

if (ob ==
null) {

return;

}

Method method = ob.getClass().getMethod("abortAnimation");

method.invoke(ob);

} catch (Exception ex) {

Log.e(TAG, ex.getMessage());

}

}

@Override

protected
int computeVerticalScrollRange() {

Scroll_height =
super.computeVerticalScrollRange();

return
Scroll_height;

}

@Override

protected
void onLayout(boolean changed,
int l,
int t, int r,
int b) {

super.onLayout(changed, l, t, r, b);

if (changed ==
true) {

view_height = b - t;

}

}

@Override

public
void requestChildFocus(View child, View focused) {

if (focused !=
null && focused
instanceof WebView) {

return;

}

super.requestChildFocus(child, focused);

}

/**

* 获取一个对象隐藏的属性,并设置属性为public属性允许直接访问

*

* @return
{@link Field} 如果无法读取,返回null;返回的Field需要使用者自己缓存,本方法不做缓存

*/

public
static Field getDeclaredField(Object object, String field_name) {

Class<?> cla = object.getClass();

Field field = null;

for (; cla != Object.class; cla = cla.getSuperclass()) {

try {

field = cla.getDeclaredField(field_name);

field.setAccessible(true);

return field;

} catch (Exception e) {

}

}

return
null;

}

}

时间: 2024-08-04 07:02:11

解决ScrollView嵌套ViewPager,导致ViewPager不能滑动的问题的相关文章

解决ScrollView嵌套RecyclerView的显示及滑动问题

项目中时常需要实现在ScrollView中嵌入一个或多个RecyclerView.这一做法通常会导致如下几个问题 页面滑动卡顿 ScrollView高度显示不正常 RecyclerView内容显示不全 本文将利用多种方式分别解决上述问题 滑动卡顿解决方案 若只存在滑动卡顿这一问题,可以采用如下两种简单方式快速解决 利用RecyclerView内部方法 recyclerView.setHasFixedSize(true); recyclerView.setNestedScrollingEnable

Android 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题

最近做的项目中遇到了ScrollView嵌套RecyclerView,刚写完功能测试,直接卡出翔了,后来通过网上查找资料和 自己的实践,找出了两种方法解决这个问题. 首先来个最简单的方法: recyclerView.setNestedScrollingEnabled(false); 这个方法就可以解决这一问题. 既然有首先那肯定有第二种解决的办法,只不过相对于第一种方法来说就太麻烦了. 我们知道ScrollView嵌套listView或者GridView的时候需要自定义listView或者是Gr

完美解决ScrollView嵌套ViewPager滑动失效和无法正常滑动冲突问题

/******************************************************************************* * Copyright 2011, 2012 Chris Banes. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the Li

android ScrollView 嵌套 ListView 不让listView滑动

1.重写listview的onMeasure() /** * 解决listview高度显示不正确 */ public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, exp

一键解决ScrollView嵌套ListView仅仅显示一行的问题

/** * 解决ScrollView嵌套ListView仅仅显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0;

一键解决ScrollView嵌套ListView只显示一行的问题

/** * 解决ScrollView嵌套ListView只显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0;

Android Scrollview嵌套RecyclerView导致滑动卡顿问题解决

一个比较长的界面一般都是Scrollview嵌套RecyclerView来解决.不过这样的UI并不是我们开发人员想看到的,实际上嵌套之后.因为Scrollview和RecyclerView都是滑动控件.会有一点滑动上的冲突.导致滑动起来有些卡顿.这个时候.我们重写一下LayoutManager就行了 例如: [java] view plain copy LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getAct

ScrollView嵌套ListView导致滑动显示不完全问题

在ListView初始化后setAdapter后面调用此方法 /**  * 重新计算ListView的高度,解决ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起冲突的问题  * @param listView  */ public void setListViewHeight(ListView listView) {   // 获取ListView对应的Adapter       ListAdapter listAdapter = listView.getAdap

【Android - 问题解决】之ScrollView嵌套ListView时总是自动滑动到ListView顶部的问题

最近做了一个项目,里面有一个ScrollView嵌套ListView的布局. 做出来之后发现,进入这个界面之后,总是自动滑动到ListView的顶部,而ScrollView中位于ListView上面的一些控件就被挤到屏幕外面去了. 解决这个问题的方法如下: 在JAVA代码中,调用ScrollView对象的这个方法: scrollView.smoothScrollTo(0, 0);