ScrollView+ListView滚动冲突,没有滑动效果 解决办法

问题背景

  • 今天做个界面需要在整个布局都要滚动的基础上添加一个ListView元素,整个布局滚动当然用ScrollView。但是在ScrollView+ListView的布局画好后,发现整个界面都无法滚动,而且ListView只显示了第一条元素。
  • 查看布局提示:The vertically scrolling ScrollView should not contain another vertically scrolling widget (ListView)。

问题分析:

  • 由上面那个提示可以看到,正常情况下ScrollView下是不允许再包含一个可滑动的View的,为什么呢?
  • 首先要了解ScrollView的工作原理,我们常用它来布局一个内容超过当前页面,需要往下滑才能看到完整内容。
  • 在这里,我们可以把ScrollView看作是一种特殊的、加长版的LinearLayout(虽然它的布局不一定是线性的,但为了便于理解我们暂且这样看),加长?有多长?
  • 系统在加载布局时其实要知道整个布局的长度,也就是上面加长后的长度,才能将整个页面显示出来。而ListView我们知道,item个数是会动态变化的,如果在ScrollView中加入ListView会让系统无法准确加载,导致了我们开始遇到的那种情况。
  • 查询很多资料后,得到了这个解决办法:

一种解决办法:

  • 有网友试过,将ListView的layout_height设置为一个定值,比如说400dp,就可以有滑动的效果。
  • 但是ListView只能显示部分元素,这不是我们想要的结果。
  • 所以就需要一种方法可以根据ListView中Item数量,动态设置ListView的height,使全部item得到显示。

最终解决方法:

    /**
     * scrollview与listview合用会出现listview只显示一行多点。此方法是为了定死listview的高度就不会出现以上状况
     * 算出listview的高度
     */
    public static void setListViewHeight(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            return;
        }
        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(1, 1);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)) + listView.getPaddingTop() + listView.getPaddingBottom();
        listView.setLayoutParams(params);
    }

拭心记于2015/5/27 http://blog.csdn.net/u011240877

时间: 2024-10-23 14:17:07

ScrollView+ListView滚动冲突,没有滑动效果 解决办法的相关文章

ScrollView嵌套EditText联带滑动的解决办法

解决ScrollView嵌套EditText的滑动事件,并且实现它们两者之间的联带滑动.什么是联带滑动呢,就是当EditText滑动到底部的时候,这时就应该让外部的ScrollView跟着滑动,好让它们之间完成连贯的滑动事件.先来看看效果把. 网上没找到完整实现的例子,只好自己撸demo了.代码里有注释,全部代码如下: package chn.fz.thatjay.scrolleditview.view; import android.content.Context; import androi

完美解决EditText和ScrollView的滚动冲突(上)

在网上搜了一下EditText和ScrollView的滚动冲突,发现差点儿全部的解决方式都是触摸EditText的时候就将事件交由EditText处理,否则才将事件交由ScrollView处理.这样确实初步攻克了两者之间的滚动冲突,但并非最好的解决方式.比方,EditText本来能够显示6行文本,可是眼下仅仅显示了5行文本,此时我们在EditText区域进行滑动并期望整个页面能够滚动,但因为我们将事件交给了EditText进行处理,所以页面并不能滚动,这种体验是极差的.事实上我们更希望当Edit

用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

MyEclipse SVN插件冲突导致不能使用解决办法

最近,由于安装插件导致Myeclipse的SVN插件不能使用,出现的问题实在很烦恼,通过试验发现当新安装的插件安装完毕后,只需要把MyEclipse 6.5/eclipse/configuration目录下的org.eclipse.update目录删除即可,并且这个目录在Myeclipse重启之后会重新生成. MyEclipse SVN插件冲突导致不能使用解决办法,布布扣,bubuko.com

[Android] Android最简单ScrollView和ListView滚动冲突解决方案

[Question]问题描述: 单独的ListView列表能自动垂直滚动,但当将ListView嵌套在ScrollView后,会和ScrollView的滚动滑块冲突,造成ListView滑块显示不完整. activity_main.xml表现: <?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/re

scrollview嵌套listview滚动冲突解决方案;

主activity页面: package com.example.scrollviewlistview; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; i

ScrollView与ListView冲突的四种解决办法

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

Android 自定义ScrollView ListView 体验各种纵向滑动的需求

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38950509,本文出自[张鸿洋的博客] 1.概述 群里的一个哥们有个需求是这样的:问题:主要功能就是:1.循环的一个滑动:2.每次滑动结束,保持每个Item的完整.然后我当时给他写了个Demo,所有代码都在Activity里面,后期看来其太恶心了,修改也不方便:貌似那哥们还因为那代码修改到12点,大大的赞一下这哥们的毅力,也深表歉意,今天特意把代码抽取成自定义的ScrollVi

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(