前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView。但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题。上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计算的。
又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经过试验发现是可以解决问题的,它的思路就是在设置完ListView的Adapter后,根据ListView的子项目重新计算ListView的高度,然后把高度再作为LayoutParams设置给ListView,这样它的高度就正确了,以下是源码:
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
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的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
在ScrollView中嵌套ListView(或者ScrollView)的另外一个问题就是,子ScrollView中无法滑动的(如果它没有显示完全的话),因为滑动事件会被父ScrollView吃掉,如果想要让子ScrollView也可以滑动,只能强行截取滑动事件,有牛人在论坛中发过代码说可以。虽然我没有亲自试过,但估计是可行的。
虽然在ScrollView中显示ScrollView在技术上的难题可以攻破,但是这样的设计却是非常差的用户体验因为用户会不容易看到和操作子ScrollView中的内容。比如好的设计是,父ListView的每个Item只显示概括性的描述,然后点击其Item会进入另外一个页面来详细描述和展示以及对这个Item的操作。
分享到:
相关推荐
在Android应用开发中,下拉刷新控件是一个非常常见的功能,尤其在列表视图(ListView)和滚动视图(ScrollView)中,它允许用户通过下拉手势更新数据,带来更流畅的用户体验。本资料包“Android下拉刷新控件(ListView好...
《名师讲坛Android开发实战经典》是李兴华老师的一部深入浅出的Android开发教程,书中涵盖了从基础到高级的众多实战项目,旨在帮助读者掌握Android应用开发的核心技术。根据压缩包文件的名称,我们可以推测这些源码...
本实战项目将教你如何在Android应用中实现类似京东的下拉刷新和上拉加载效果。 首先,我们要理解下拉刷新(Pull-to-Refresh)和上拉加载(Load-more)的基本概念。下拉刷新通常应用于列表视图(ListView)或滚动...
在Android开发中,ListView和ViewPager是两个非常常用的组件。ListView用于展示大量的列表数据,而ViewPager则用于实现页面的滑动切换,通常用于实现类似轮播图的效果。在本项目"ListViewDemo"中,我们将这两者结合...
这个"android实战DeMo--英文词典"项目显然就是这样一个实例,它结合了Android平台、网络请求库Volley以及数据解析库Gson的核心功能。让我们详细探讨一下这些关键知识点。 首先,Android是Google推出的一种开源移动...
【标题】"仿iPhoneListView" 是一个Android开发中的实践项目,旨在实现类似iPhone风格的可扩展列表视图。这种列表视图通常具有清晰的层级结构,可以方便地展示多级数据,例如联系人分组或者文件目录结构。在Android...
在这个项目中,我们将探讨Android客户端开发的关键技术和实现方法。 一、Android基础知识 1. Android SDK:Android应用程序开发的基础工具集,包括Java开发工具、模拟器、调试工具等。 2. Activity:Android应用的...
在Android开发中,实现“仿QQ分组列表效果”是一个常见的需求,这涉及到自定义ListView或者RecyclerView的使用,以及对数据结构和UI布局的深入理解。QQ分组列表的效果通常是将联系人按照不同的分组(如字母A-Z)进行...
在Android面试过程中,面试官通常会考察候选人的技术深度、实际开发经验和问题解决能力。这份"android面试题.zip"文件可能包含了一些常见的Android面试问题,旨在帮助应聘者准备面试。以下是一些Android开发中关键的...
在"Android项目实战--手机卫士33--ExpandableListView的使用"这个主题中,我们将深入探讨如何在实际的手机卫士应用中有效地利用这种控件。 首先,`ExpandableListView`是`ListView`的一个扩展,提供了更丰富的功能...
在Android开发中,ScrollView和HorizontalScrollView是两种常用的布局控件,它们允许用户在垂直或水平方向上滚动内容。本项目"Android应用源码之ScrollViewAndHorizontalViewSample"提供了关于这两个控件的实战示例...
在Android开发中,这样的系统通常会使用Java语言编写,结合Android Studio作为集成开发环境。下面我们将深入探讨相关的知识点。 1. **Android开发基础**: - **Java语言**:Android应用主要用Java编写,虽然Kotlin...
在Android开发中,用户界面的交互性和可扩展性是提升用户体验的关键因素之一。SlideExpandableListView是Android系统中ListView的一个扩展,它增加了滑动展开和收起子项的功能,使得列表展示更加丰富和动态。本文将...
- **布局设计**:掌握创建复杂布局的技巧,如嵌套布局、自适应布局等。 - **属性设置**:理解视图属性的作用,合理设置以提高视图性能。 - **类结构设计**:介绍如何通过继承和扩展现有视图类来创建自定义视图。 ##...
在涉及到多个选项的列表时,RadioButton或CheckBox可能被嵌套在ListView的每一项中,通过Adapter进行动态渲染。 毕业设计往往还需要考虑应用的整体架构,例如MVP(Model-View-Presenter)或MVVM(Model-View-...
总的来说,"SckyListHeadersListView"项目展示了如何在Android中通过自定义ListView实现类似联系人列表的效果,包括自定义适配器、实现SectionIndexer、性能优化以及添加各种交互功能。这是一个典型的Android开发...
在Android开发中,为了提供用户友好的交互体验,经常需要实现一些特殊效果,例如左滑删除功能。这个功能常见于各种列表或者网格视图中,用户可以向左滑动列表项来显示删除按钮或者触发删除操作。本篇将详细介绍如何...
在黑马66期的Android学习笔记中,重点讲解了线性布局的特性及其在实际应用中的运用。下面将详细阐述线性布局的相关知识点。 一、线性布局介绍 线性布局按照垂直或水平方向排列其子视图(Views),这些子视图会依次...
3. 事件处理:在Android中,事件处理主要通过OnClickListener、OnTouchListener等接口实现。源码中会包含各种事件监听器的实现,通过这些代码可以学习到如何响应用户的触摸操作。 4. 数据绑定与适配器:UCWEB7.4...
在Android开发中,RecycleView和NestedScrollView是两个非常重要的组件,它们被广泛用于构建高效、可滚动的用户界面。本篇文章将详细讲解如何在项目中实现“仿网易严选”的上滑回弹效果,结合RecycleView和...