探讨:如何在ScrollView中嵌套ListView_Android

一、分析

1、最简单的布局:只有一个ListView

如果整个页面只有一个ListView的话,那么由于ListView本身带有滚动效果,所以当加载的数据超过页面显示的范围时,可以通过上下滑动来查看所有的item。
因此这种情况下,不需要添加ScrollView。

2、其它布局A+ListView

这种情况下,如果布局A定义在ListView的前面,那么当布局A所占的比例较大,或者ListView加载的数据较多时,都会导致ListView显示不完全。同样,由于ListView自身可以滚动,因此仍然可以通过上下滚动来查看ListView的所有item。
如图所示:

 

3、其它布局B+ListView

这种情况下,假设布局B定义在ListView的后面,那么就会出现两种情况:
(1)、ListView加载的数据不多,可以完全显示ListView的每一项,那么如果后面还有足够剩余的空间的话,布局B能正常显示;
(2)、ListView加载的数据加多,那么就会导致留给布局B的空间不足,或者根本就没有,布局B将会显示不完全或者完全不显示。
而不管怎么,ListView本身的内容,都可以通过滑动来查看。

对于第三种情况,如果不重新考虑布局的话,那么就需要添加ScrollView,用于查看剩余页面内容。

 

二、ScrollView和ListView的冲突问题

1、给ListView指定一个高度
例如设置android:layout_height="240dip",那么可以解决,可能会影响美观。
如图所示:

2、外面再添加个ScrollView

这种情况下,会出现问题。如图所示:

3、给ScrollView设置属性:android:fillViewport="true"
测试的时候发现,如果ListView加载的数据不多的话,确实可以解决,但是当ListView加载的数据较多的时候,仍旧无法显示完全,并且这个时候ListView自身也无法滚动了。

三、解决办法有两种
1、在计算listview总高度并设置
ListView listView = (ListView) findViewById(id);
YourAdapter adapter = new MyAdapter("初始化你的适配器");
listView.setAdapter(adapter);
setListViewHeightBasedOnChildren(listView);(在setAdapter后调用自定义的方法)

复制代码 代码如下:

/**
* @param listView
*/
private void setListViewHeightBasedOnChildren(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(0, 0);
totalHeight += listItem.getMeasuredHeight();
}

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

使用该方法需要注意:子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
2、 自定义ListView,重载onMeasure()方法,设置全部显示

复制代码 代码如下:

package com.meiya.ui;

import android.widget.ListView;

/**
*
* @Description: scrollview中内嵌listview的简单实现
*
* @File: ScrollViewWithListView.java
*
* @Paceage com.meiya.ui
*
*
* @Date 下午03:02:38
*
* @Version
*/
public class ScrollViewWithListView extends ListView {

public ScrollViewWithListView(android.content.Context context,
android.util.AttributeSet attrs) {
super(context, attrs);
}

/**
* Integer.MAX_VALUE >> 2,如果不设置,系统默认设置是显示两条
*/
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);

}

}

以上可以解决scrollView内嵌listView,但是有一个问题是第一次进入界面时动态加载listview的items后页面会跳转到listview的第一个子项,这很蛋疼,
无奈又不知道怎么解决,就先用

复制代码 代码如下:

scrollView.post(new Runnable() { 
      //让scrollview跳转到顶部,必须放在runnable()方法中
    @Override 
    public void run() { 
     scrollView.scrollTo(0, 0); 
     } 
   });

这个方法过度下,希望有知道的朋友还给点解决方案
3、使用scrollView +LinearLayout用addView()的方法添加列表。

时间: 2024-11-01 19:14:22

探讨:如何在ScrollView中嵌套ListView_Android的相关文章

scrollview中嵌套SwipeListView在侧滑删除的时候禁止listview的上下滑动

问题描述 scrollview中嵌套SwipeListView在侧滑删除的时候禁止listview的上下滑动 scrollview中嵌套listview ,listview的长度超过屏幕的话就找不到scrollview的焦点了,listview是继承SwipeMenuListView可以左右滑动. 已经在listview中设置 /** * 设置不滚动 */ @Override public void onMeasure(int widthMeasureSpec, int heightMeasur

Android开发之ScrollView中嵌套ListView的解决方案

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

ScrollView中嵌套复杂布局

问题描述 ScrollView中嵌套复杂布局 布局如下: 布局只写了一个大概,ScrollView中有ViewPager,TextView,ListView等多个控件, ScrollView与ListView的冲突已经解决,ListView的高度也完全能够显示, 但是当布局初始化的时候,ListView上方的控件全部都没有显示,ScrollView中, 屏幕显示的内容只有ListView,只有手动下滑才会显示ListView上面的ViewPager,TextView等控件. 哪位大神可以帮忙一下

Android如何在ListView中嵌套ListView

前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题.上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计算的. 又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经过

Android实战技巧:如何在ListView中嵌套ListView

 前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView.但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题.上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计算的. 又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经

探讨如何在Eclipse中过滤版本控制文件.svn

当我们使用版本管理工具的时候,比如 CVS.SVN或者harvest,都会在 checkout 到本地的源代码中发现很多代码之外的多余文件夹及文件,这些文件夹及文件对于版本管理工具而言非常重要,不能随便删除,但是在我们的项目开发中却显得有些碍手碍脚.在Eclipse中可以通过如下方式进行排除:方法一:"Project->Properties->Java Build Path",右侧的面板中的"Source"选项卡,展开"source folde

探讨如何在Eclipse中过滤版本控制文件.svn_java

当我们使用版本管理工具的时候,比如 CVS.SVN或者harvest,都会在 checkout 到本地的源代码中发现很多代码之外的多余文件夹及文件,这些文件夹及文件对于版本管理工具而言非常重要,不能随便删除,但是在我们的项目开发中却显得有些碍手碍脚.在Eclipse中可以通过如下方式进行排除:方法一:"Project->Properties->Java Build Path",右侧的面板中的"Source"选项卡,展开"source folde

探讨:如何在NDK中呼叫Java的class_Java编程

废话不多说,直接上码....... 复制代码 代码如下: package com.clouddevelop.cloudbox;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.FontMetrics;public class TextManage

探讨如何在php168_cms中提取验证码_php技巧

复制代码 代码如下: <?phpfunction yzImg($nmsg){ if (function_exists('imagecreatetruecolor')){  $imstr[0]["s"]=$nmsg[0];  $imstr[1]["s"]=$nmsg[1];  $imstr[2]["s"]=$nmsg[2];  $imstr[3]["s"]=$nmsg[3];  //文件头...  header("