`
在下个路口
  • 浏览: 111153 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

ListView实现树形菜单——listview整体水平与垂直同时滚动(ScrollerView嵌套ListView)

阅读更多
    最近在项目中用ListView实现了一个树形菜单,菜单层级可以无限,数据动态填充,写这个控件确实是花了不少的时间,而且代码逻辑也比较复杂。所以在这里并不是把整个源码贴出来,因为太多了,逻辑也比较难懂,我怕自己讲不清楚,所以这里只是记录一下在此过程中遇到的某方面的问题。
    因为在项目中的数据是动态填充的,即每个树节点都是从服务器端请求,然后解析获取的。那这样的话就有一个问题就是listview的宽度跟高度问题。每一行的数据高度或者宽度都是不定的,所以想到用ScrollerView嵌套ListView,使之可以水平和垂直同时滚动。我第一次听到这个结构的时候很诧异,为什么ListView还要嵌套ScrollerView呢,怎么会有这么奇怪的需求呢?不过别诧异,现在想想还是有很多地方用到这种结构的,比如美团网中一个页面。在我的这个项目中,需求是这样的,从服务端获取数据,解析出来,显示在树形选择菜单中,因为数据宽高不定,所以需要水平与垂直同时滚动,滚动风格就是windows窗口垂直方向与水平方向的滚动条风格!就是下面图片的这种风格:
   
    我们都知道,ScrollerView(垂直)和ListView都是带滚动的控件,其它比如GridView等同理。那么,用一个滚动控件嵌套另一个滚动控件会出现什么问题呢?在ScrollerView中嵌套ListView,该ListView只会显示第一行的高度,这是因为当ListView嵌套在ScrollerView中时,系统是无法计算出其高度的,只会显示第一行的高度,具体可以参照源码,反正关于这个得源码很多,我没有坚持下来看完。同理嵌套HorizontalScrollView只会显示第一行的宽度。所以就牵涉到了ListView动态设置宽高问题。总结一下需解决的问题:ListView同时双向滚动,ListView动态设置宽高。

    下面是布局文件:
   
 
<!--ScrollView嵌套ListView注意事项:       
 ScrollView中只能包含一个子标签             
 需要动态代码计算设置ListView高度或宽度        
 listView宽高最好都设置为match-parent,否则数据多时会OOM           	 
 计算宽高时ListView子项item根布局必须得是LinearLayout,否则measure()时NullPointException
 android:fillViewport="true" 水平滚动显示一个窗口大小-->
                  <ScrollView
	    				android:id="@+id/vertical_scrollbar"
	    			  	android:layout_width="450dp"
	    				android:layout_height="475dp"
	    				android:fadeScrollbars="false"
                	    android:scrollbarFadeDuration="0"
                	    android:layout_marginTop="5dp"
                	    android:scrollbarThumbVertical="@drawable/tree_listview_vertical_scrollbar"
                	    android:scrollbarTrackVertical="@drawable/tree_listview_vertical_scrollbar_bg"
                	    android:scrollbars="vertical">
                	  	<HorizontalScrollView
                	    	android:id="@+id/horizontal_scrollbar"
	    					android:layout_width="match_parent"
	    					android:layout_height="460dp"
	    					android:scrollbarThumbHorizontal="@drawable/tree_listview_horizontal_scrollbar"
                	        android:scrollbarTrackHorizontal="@drawable/tree_listview_horizontal_scrollbar_bg"
                	        android:fadeScrollbars="false"
                	        android:fillViewport="true"
                	        android:scrollbarFadeDuration="0">
                	        <!--必须在listview外包裹一层线性布局,否则无法设置其宽度 -->
                	        <LinearLayout
                	            android:layout_width="wrap_content"
                	            android:layout_height="wrap_content"
                	            android:orientation="vertical">
                				<ListView
                	    			android:id="@+id/list_resource_list"
                	    			android:layout_width="match_parent"
                	    			android:layout_height="match_parent"
                	   				android:layout_marginBottom="10dp"
                	    			android:layout_marginLeft="5dp"
                	    			android:layout_marginTop="2dp"
                	    			android:cacheColorHint="#ffffffff"
                	    			android:divider="@drawable/listview_tree_divider"
                	    			android:dividerHeight="2.0dip"
                	    			android:drawSelectorOnTop="false"
                	    			android:fadingEdgeLength="0.0sp"
                	    			android:fastScrollEnabled="false"
                	    			android:fadeScrollbars="false"
                	    			android:scrollbarFadeDuration="0"
                	    			android:scrollbars="none"/>
                			</LinearLayout>
                		 </HorizontalScrollView>
                	</ScrollView>
 
之所以要嵌套一个垂直的ScrollerView而不用ListView自带的滚刀条,这是因为我需要固定滚动条在右边缘的位置,不随ListView的宽度而改变位置,如果用ListView在带的滚动条,它会始终在ListView的右边缘,当ListView的宽度改变后,其位置也改变了,这样不美观!嵌套需要注意的地方在代码中已经提出了。android:scrollbarThumbVertical这个属性是设置滚动条,android:scrollbarTrackVertical这是滚动轨迹。滚动都是有这个属性的,水平滚动对应改成android:scrollbarThumbHorizontal和android:scrollbarTrackHorizontal即可。还有一些属性不一一说明了。接下来就是在代码中设置宽跟高了。
              
 /**
	    * 根据item设置listView宽度和高度
	    * @param listView
	    * @return
	    */
	   public void setListViewSizeBaseChrildren(){
		   int items=resource_list.getAdapter().getCount();
		   int maxItemWidth=0;
		   int totalHeight=0;
		   int widthParams,heightParams;
		   for(int i=0;i<items;i++){
			   View itemView=resource_list.getAdapter().getView(i, null, resource_list);
			   itemView.measure(0, 0);
			   int itemWidth=itemView.getMeasuredWidth(); 
			   totalHeight+=itemView.getMeasuredHeight();
			   if(itemWidth>maxItemWidth){
				   maxItemWidth=itemWidth;
			   }
		   }
		   //保证listView最小宽度不小于450dp
		   if(maxItemWidth>450){
			   widthParams=maxItemWidth+(resource_list.getDividerHeight()*20);
		   }else{
			   widthParams=450;
		   }
		 //保证listView最小高度不小于475dp
		   if(totalHeight>475){  
			   heightParams=totalHeight+(resource_list.getDividerHeight()*(resource_list.getAdapter().getCount()-1))+18;
		   }else{
			   heightParams=475;
		   }
		   ViewGroup.LayoutParams params=resource_list.getLayoutParams();
		   params.width=widthParams;
		   params.height=heightParams;
		   resource_list.setLayoutParams(params);
	   }
  
     在需要设置的时候,调用该方法即可,方法中的一些大小数据是本身项目需要,可以自行调整。这样这个ListView就可以整体的水平和垂直滚动了,注意是整体滚动,有时网上说的横向滚动的ListView是指把Item横向排列,这种需要自定义了!
    
  • 大小: 2.4 KB
分享到:
评论

相关推荐

    android的listview嵌套listview,列表嵌套列表 android studio版本

    总结来说,实现Android的ListView嵌套ListView需要理解ListView的工作机制,创建并管理两个Adapter,以及在布局文件中正确地嵌套ListView。这虽然不是特别高深的技术,但却是Android开发中常见的需求,熟练掌握能...

    listView嵌套listViewDemo

    标题"listView嵌套listViewDemo"指的是一个示例项目,旨在解决此类问题。描述中提到,这个Demo解决了子ListView无法完全显示所有内容的困境,这是通过自定义ListView实现的。 ListView嵌套ListView的问题通常出现在...

    ListView嵌套GridView以及ListVIew嵌套ListVIew

    接下来,我们讨论ListView嵌套ListView的时间轴效果。时间轴通常用于展示按时间顺序排列的事件,如社交媒体的动态更新。在这种情况下,主ListView用于展示各个时间点,而每个时间点下又可能有多个子事件,这些子事件...

    ListView实现二级菜单

    最后,为了提高用户体验,可以在一级菜单的ListView中使用HeaderView来显示二级菜单的标题,同时二级菜单的ListView可以使用HeaderView来模拟嵌套效果。这样,用户就能看到清晰的层级关系。 以上就是如何使用SQLite...

    listView 嵌套 ListView demo

    1. **创建数据模型**:设计适合多级数据的类结构,例如使用树形结构(Tree或Node)来表示每个主列表项和其对应的子列表项。 2. **自定义Adapter**:你需要创建一个自定义的Adapter,这个Adapter需要继承自`...

    ListView嵌套ListView全选,多选

    标题“ListView嵌套ListView全选,多选”涉及到的关键知识点主要包括以下几个方面: 1. **嵌套ListView**:在一个ListView的每个Item内部再放置一个ListView,这样可以形成树状结构,便于展示层次化的数据。这种...

    2个ListView实现多级菜单

    6. **布局设计**:在XML布局文件中,将两个ListView嵌套在一个父布局中,例如垂直的LinearLayout或RelativeLayout。一级ListView通常放在顶部,二级ListView在其下方。确保在二级ListView上设置`android:...

    ListView嵌套ListView带多选,全选,反选,选中数量

    本项目"ListView嵌套ListView带多选,全选,反选,选中数量"着重解决了在嵌套ListView中实现多选、全选、反选以及动态显示选中数量的功能。下面将详细介绍这些关键知识点。 1. **嵌套ListView**: 在Android中,...

    Android listview嵌套listview

    下面将详细解释如何实现Android中的ListView嵌套。 1. **基础概念** - **ListView**: Android提供的可滚动视图,用于显示一系列相同的数据项。 - **Adapter**: ListView的数据源,负责将数据转化为ListView可显示...

    ListView的嵌套,动态设置ListView的高度

    实现ListView嵌套主要涉及以下几个步骤: 1. **创建适配器**:对于每一个ListView,都需要一个适配器(Adapter)来提供数据和视图之间的桥梁。你需要为父ListView和子ListView分别创建自定义的Adapter,它们负责将...

    listView嵌套listView

    然而,在某些复杂的界面设计中,我们可能需要在一个ListView中嵌套另一个ListView,这就是所谓的"ListView嵌套ListView"。这种布局方式可以帮助我们实现更丰富的用户界面,比如在商品详情页显示多个级别的属性选项。...

    listview嵌套listview实现评论效果

    通过以上步骤,我们可以实现ListView嵌套ListView的功能,模拟出评论的效果。在"commenttest"这个项目中,很可能是包含了一个简单的示例代码,展示了如何实现这个功能。通过查看和学习这个项目的源码,你可以更深入...

    viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页

    标题"viewpage嵌套listview,效果:滑动listview删除,滑动非listview区域viewpage翻页"描述的就是这样一个功能:在ViewPager中嵌套了一个ListView,ListView支持滑动删除,而当滑动到ListView之外的区域时,...

    解决Scrollview嵌套listview下拉刷新的一些问题

    在ScrollView中嵌套ListView,通常需要实现下拉刷新功能。但因为滑动冲突,下拉刷新手势可能无法正常触发。 **解决方案**: 1. 使用SwipeRefreshLayout作为外层容器,将ScrollView替换为它。SwipeRefreshLayout专门...

    android listview嵌套listview实现折叠列表

    总之,实现Android中的嵌套ListView折叠列表需要对ListView的工作原理有深入理解,并能灵活运用Adapter和视图复用机制。同时,合理优化和选择合适的组件也是提高性能的关键。在实际开发中,应根据项目需求和性能要求...

    android 嵌套的listview示例

    在Android开发中,有时我们需要在一个ListView中嵌套另一个ListView,以实现更为复杂的数据展示效果,这就是所谓的“嵌套ListView”。这种布局方式常用于展现层级关系数据,如目录结构、论坛帖子回复等。本文将深入...

    ScrollView,嵌套ListView,ListView并同时嵌套GridView

    在Android开发中,ScrollView、ListView和GridView是三个非常重要的视图组件,它们分别用于实现不同的滚动展示效果。本文将深入探讨如何在Android应用中正确地嵌套这些组件,以及处理可能遇到的问题。 首先,...

    方便实用的 嵌套 ListView 写法

    在Android开发中,嵌套ListView(Nested ListView)是一种常见的组件使用场景,特别是在处理具有层级关系的数据时,如目录结构、菜单栏等。本教程将深入探讨如何实现一个方便实用的嵌套ListView,以及如何优化其性能...

    Android ScrollView嵌套ListView嵌套GridView的上下拉以及加载更多

    最后,关于`ScrollView_GridView_listViewRefresh_Demo`这个示例项目,它很可能是包含了一个实际运行的代码实例,演示了如何在ScrollView中嵌套ListView和GridView,并实现了上下拉刷新和加载更多功能。通过查看和...

    Listview嵌套Listview

    然而,有时我们需要在一个ListView的项中再嵌套另一个ListView来实现更复杂的布局结构,这就是所谓的“ListView嵌套ListView”。这种技术通常用于呈现层级数据,例如目录树、论坛帖子等。在Android Studio环境下,...

Global site tag (gtag.js) - Google Analytics