ScrollView viewPager ListView 结合使用的问题及解决办法

1. 解决ScrollView 和viewPager滑动冲突的问题

需要重写ScrollView ,使得viewpager获取到横向滑动事件

代码如下

public class PagerScrollView extends ScrollView {

private GestureDetector mGestureDetector;

public PagerScrollView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

init();

}

public PagerScrollView(Context context) {

super(context);

init();

}

public PagerScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

private void init() {

mGestureDetector = new GestureDetector(getContext(),

new YScrollDetector());

setFadingEdgeLength(0);

}

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

return super.onInterceptTouchEvent(ev)

&& mGestureDetector.onTouchEvent(ev);

}

private 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;

}

}

}

2. viewpager在scrollVIew不显示问题

需要设置scrollView 的属性 android:fillViewport="true"

viewPager先给一个固定高度,之后会动态改变

3. viewPager中加入ListView不能滚动问题

需要计算listView的高度,同时需要动态设置viewpager的高度

重写listView

public class ListViewForScrollView extends ListView {

public ListViewForScrollView(Context context) {

super(context);

}

public ListViewForScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public ListViewForScrollView(Context context, AttributeSet attrs,

int defStyle) {

super(context, attrs, defStyle);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

}

计算listview 的高度

/**

* 获取Listview的高度,然后设置ViewPager的高度

*

* @param listView

* @return

*/

public static int setListViewHeightBasedOnChildren1(ListView listView) {

// 获取ListView对应的Adapter

ListAdapter listAdapter = listView.getAdapter();

if (listAdapter == null) {

// pre-condition

return 0;

}

int totalHeight = 0;

for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目

View listItem = listAdapter.getView(i, null, listView);

listItem.measure(0, 0); // 计算子项View 的宽高

totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度

}

ViewGroup.LayoutParams params = listView.getLayoutParams();

params.height = totalHeight

+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));

// listView.getDividerHeight()获取子项间分隔符占用的高度

// params.height最后得到整个ListView完整显示需要的高度

listView.setLayoutParams(params);

return params.height;

}

5. scrollView滚动到顶端问题

uiHandler.post(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

scorllView.scrollTo(0, 0);

}

});

基本这5步可以解决问题

时间: 2024-11-13 07:53:07

ScrollView viewPager ListView 结合使用的问题及解决办法的相关文章

用BaseAdapter适配ListView只显示了一行的解决办法

今天我用BaseAdapter去适配一个ListView,结果只显示了一行,原来应该是有那个ArrayList<...>的size行的数据的.很奇怪. 我是这样写的ListView所在Layout.xml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <ScrollView 3 android:layout_width="match_parent" 4 android:lay

Android Scrollview 内部组件android:layout_height="fill_parent"无效的解决办法

Found the solution myself in the end. The problem was not with the LinearLayout,  but with the ScrollView (seems weird, considering the fact that the ScrollView was expanding, while the LinearLayout wasn't). The solution was to use android:fillViewpo

android viewpager fragment切换时界面卡顿解决办法

目前开发的程序在切换View时界面卡顿现象比较严重,影响用户体验,当前项目共就四个View,每个View也只是按钮,所以可以同时加载,不让其它view销毁. 只需在Adapter中重载destroyItem类即可 @Override public void destroyItem(ViewGroup container, int position, Object object) { //重载该方法,防止其它视图被销毁,防止加载视图卡顿 //super.destroyItem(container,

ScrollView ViewPager ListView三者共存的问题

场景描述: ScrollView是整个界面的外层滑动控件,嵌套在里面的布局是ViewPager,ViewPager里面其中一个Page是ListView控件. 问题描述: ViewPager中的ListView获取到数据后不能显示,也就是不能展开,外层ScrollView不能滑动. 解决思路: 1.让ListView展开.(网上的说法是ScrollView与ListView嵌套不可取,但开发中设计界面如此,不用也不成,闲话少说),想让ListView撑开,只能依靠设置Adapter每个Item高

ScrollView起始位置不是最顶部的解决办法

最近遇到了打开带有ScrollView的页面布局默认起始位置不是最顶部的情况,最后发现问题是因为ScrollView内部嵌套了gridview,只需要设置gridview获取焦点为false即可. gridview.setFocusable(false); 如果内部嵌套的是listview,也是同样的处理方法. PS:网上还查到说可以设置myScrollView.smoothScrollTo(0,20); 原文:http://blog.csdn.net/cn2007/article/detail

安卓之listview和textview争抢焦点的解决办法

查找了网上很多文章,说是在XML文件设置textview的focus为false ,简直是一派胡言,那样连文本都输入不了了,有何用 网上查找无果,改用java代码控制listview的longclick方法,实现弹出复制和删除listview的办法 自定义一个popWindow private void initPopupWindow(LayoutInflater inflater) { View view = inflater.inflate(R.layout.pop_item_layout,

【iOS开发-53】案例学习:scrollView的核心用法以及无法滚动的解决办法

案例效果: (1)主要的就是练习scrollView的用法.界面里面的其他元素基本都是UIView和UIButton堆砌起来的. (2)主要用代码实现,当然,可以先用storyboard拖个scrollView出来.注意需要滚动的都需要放在scrollView,注意层级关系. (3)我们要在代码中使用设置这个scrollView所以直接拖拽形成一个变量,代码都在ViewController.m中: --设置scrollView的最重要的三个属性如下,已用注释标出. --取得一个控件的最大最小X和

四种方案解决ScrollView嵌套ListView问题(转)

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方案解决ScrollView嵌套ListView问题

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S