ListView 分组显示信息

Anroid(仿虎扑体育)ListView中数据按照时间\日期分组(分类) 最近笔者在做一个项目。需求里面有一个特效是一个list:带日期标题(格式:yyyy-MM-dd)的时间树,item为(格式:HH:mm:ss),并且在滑动过程中,当日期标题滑动到顶部的时候,进行悬浮;下一个日期标题到达顶部的时候把前一个header顶上去,废话不多少,先上效果图。      首先是需求想要实现的效果,仿虎扑体育。 ;;        然后是笔者实现的效果(因 阅读详情

继上一篇ListView显示柱状图,并解决滚动时内容重复的问题之后,针对于有分组的数据,应该如何处理呢?数据结构在第一篇文章中请查看NameValue类中的getNameValues()方法,里面放有name,value,filter。使用filter字段对数据结构进行分组

思路:

1.      拿到这样的一个数据结构,想到的第一件事,就是将数据进行重组,然后在使用Adapter绑定到ListView中。

2.      获取的数据不固定,那么在重组数据时需要有大量消耗时间问题,此时线程应该出现了。

那么好,接下来就按照以上思路走吧,等碰到问题在分析,一下代码是在前篇博客基础上做的修改,有不太明白的朋友可以先看上一篇博文ListView显示柱状图,并解决滚动时内容重复的问题

1.      创建Layout文件,这是启动页start_layout_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
	<ScrollView android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    android:id="@+id/sv">
	    <LinearLayout android:layout_width="match_parent"
	        android:layout_height="match_parent"
	        android:orientation="vertical"
	        android:id="@+id/outerLinear"></LinearLayout>
	</ScrollView>

</LinearLayout>

2.      修改activity_main.xml文件[注:这是上面博文的启动页,稍作修改]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
     <TextView android:layout_width="match_parent"
        android:layout_height="25dip"
        android:text="123"
        android:background="@color/chart_bg"
        android:id="@+id/tvTitle"
        android:gravity="center_vertical"/>
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>
</LinearLayout>

此时注意这个文件中的ListView,具体问题稍作解释


3.      将数据分组

/**
	 * 获取集合中的所有分组数据
	 * @param options 原始的数据集合
	 * @return 具体的分组数据
	 */
	private ArrayList<String> getTypes(ArrayList<NameValue> options){
		ArrayList<String> type = new ArrayList<String>();
		for (int i = 0; i < options.size(); i++) {
			if(!type.contains(options.get(i).filter)){
				type.add(options.get(i).filter);
			}
		}
		return type;
	}
	
	/**
	 * 组装数据结构
	 * @param options 
	 * @return
	 */
	private HashMap<String,ArrayList<NameValue>> getValues(ArrayList<NameValue> options){
		ArrayList<String> typeList = getTypes(options);
		HashMap<String,ArrayList<NameValue>> vd = new HashMap<String, ArrayList<NameValue>>();
		
		for (int i = 0; i < typeList.size(); i++) {
			ArrayList<NameValue> nameValues = new ArrayList<NameValue>();
			
			for (int j = 0; j < options.size(); j++) {
				if(typeList.get(i) == options.get(j).filter){
					nameValues.add(options.get(j));
				}
				vd.put(typeList.get(i), nameValues);
			}
		}
		return vd;
	}

4.      添加Thread和Handler

Handler handle = new Handler()
	{
		public void handleMessage(Message msg) {
			if(msg != null)
			{
				HashMap<String,Object> vd =(HashMap<String,Object>)msg.obj;

				Log.i("个数", String.valueOf(vd.size()));
//				ScrollView view = (ScrollView)findViewById(R.id.sv);
				LinearLayout view = (LinearLayout)findViewById(R.id.outerLinear);
				
				ArrayList<String> strType = (ArrayList<String>)vd.get("types");
				HashMap<String,ArrayList<NameValue>> values =(HashMap<String,ArrayList<NameValue>>)vd.get("mList");
				
				for (String str : strType) {
					View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.activity_main,null,false);
					ListView listView =(ListView)v.findViewById(R.id.listView);
					TextView title = (TextView)v.findViewById(R.id.tvTitle);
					ArrayList<NameValue> valuesList = values.get(str);
					
					MyAdapter sim = new MyAdapter(MainActivity.this, valuesList,width);
					listView.setAdapter(sim);
					title.setText(str);
					view.addView(v);
				}
				
			}
		};
	};	
class myThread extends Thread{
		
		@Override
		public void run() {
			HashMap<String,Object> vd = new HashMap<String, Object>();
			vd.put("types", getTypes(values));
			vd.put("mList", getValues(values));
			
			System.out.print(vd.size());
			Message msg = new Message();
			msg.obj = vd;
			handle.sendMessage(msg);
		}
	}

5.      修改MainActivity中的onCreate()方法

ArrayList<NameValue> values;
	int width;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.start_layout_activity);
//		ListView listView = (ListView)findViewById(R.id.listView);
		values = NameValue.getNameValues();
//		//width:当前设备的宽度
		width = this.getWindowManager().getDefaultDisplay().getWidth();
//		MyAdapter mydapter = new MyAdapter(MainActivity.this, values, width);
//		listView.setAdapter(mydapter);
		new myThread().start();
	}

此时,运行下看下结果


不知此时有没有注意到什么,里面listView的高度不正确,原因是在ListView外层套了ScrollView,两个都带滚动条,然后listView中的高度android:layout_height=”match_parent”根本没发挥作用,那此时需要设置ListView的实际高度来确定,所以需要onMeasure方法。

 

什么时候调用onMeasure方法

当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec.
这两个参数指明控件可获得的空间以及关于这个空间描述的元数据.
更好的方法是你传递View的高度和宽度到setMeasuredDimension方法里,这样可以直接告诉父控件,需要多大地方放置子控件.

 

此时我们需要去掉ListView的滚动条

6.      重写ListView,我们创建类UnscrollableListView


public class UnscrollableListView extends ListView {	
	public UnscrollableListView(Context context) {
		super(context);
	}
	
    public UnscrollableListView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    } 
    
    public UnscrollableListView(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    }
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

7. 修改activity_main.xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
     <TextView android:layout_width="match_parent"
        android:layout_height="25dip"
        android:text="123"
        android:background="@color/chart_bg"
        android:id="@+id/tvTitle"
        android:gravity="center_vertical"/>
    <com.example.listviewdemo.view.UnscrollableListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.example.listviewdemo.view.UnscrollableListView>
</LinearLayout>

完成后截图


ListView分组实现方案(一) ListView分组思路和实现代码简单实现 阅读详情

相关推荐

VB中ListView控件应用指南与示例

ListView控件允许开发者在列表中展示数据项,这些数据项可以是简单的文本,也可以是带有图标和子项的复杂组合。它通常用于创建文件管理器、联系人列表以及其他需要对数据项进行分组和排序的应用。在第二章中,我们介绍了ListView控件的基本使用和集成方法,接下来我们将深入探讨如何通过高级功能和自定义设置,来增强ListView控件的用户体验和功能性。ListView的列头(ColumnHeader)是展示数据的一个重要组成部分,自定义列头样式可以让数据展示更加直观和美观。

weixin_42452924的博客 1104

listview 分组显示+可展开分组+每个item可左右滑动

listview 分组显示+可展开分组+每个item可左右滑动+多级分组

Android中ListView中数据按照时间\日期分组(分类)标题可悬浮,可下拉刷新

仿虎扑,带悬浮标题的PinnedSectionRefreshListView,帶下拉刷新的Demo,实现时间按照日期和时分秒进行分类.关于PinnedSectionRefreshListView中注释显示英文问题,可以下载http://download.csdn.net/detail/qq_28690547/9310615这个链接,查看里面PinnedSectionListView中的中文注释.因为时间问题偷懒没有转换.有什么问题欢迎留言,我会一一为大家解答的

Delphi TListview自绘实现每行或每列或每个单元格根据内容显示不同颜色

【代码】Delphi TListview自绘实现每行或每列或每个单元格根据内容显示不同颜色。

wh445306 1580

Android使用RecyclerView实现日期分组以及时间轴显示

【代码】Android使用RecyclerView实现日期分组以及时间轴显示。

qq_31481093的博客 1632

Group Items in Delphi's TListView Control

 By Zarko Gajic, The TListView Delphi control displays and manages a list of items, displayed in columns, vertically or horizontally, with small or large icons. Windows XP, and later versions,

iseekcode的专栏 1387

Android ListView分组显示,分组标题悬浮,点击查看分组的功能实现

这几天做的项目要求在listview上分开组别,并且

u013272307的专栏 3602

使用ListView,ImageList,ContextMenuStrip显示信息

QQ好友展示 1. ListView列表控件常用属性 属性 说明 Columns “详细信息” 视图中显示的所有图像 FullRowSelect 当选中一项时,它的子项是否同该项一起突出显示 Items ListView中所有项的集合 MultiSclect 是否允许选择多项 SelectedItems 选中项的集合 View 指定ListView的视图模式 LargeImageList 获取或设置当项以大图标在控件中显示时使用的ImageList SmallI

自学之路←_← 563

ListView使用ArrayAdpater显示信息列表

此文,仅做为个人学习Android,记录成长以及方便复习!市场上常见的两种ListView图中的纯文字版包括标题和具体解释的item。图文并茂的ListView需要通过SimpleAdapter实现。本文使用的ArrayAdapter实现纯文字的ListViewactivity_main.xml&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;Rel...

qqazl001的博客 648

Xamarin.Forms 用户界面——控件——ListView——List外观

列表外观 使用页眉,页脚,组和可变高度单元格自定义ListView。 PDF用于离线使用 下载PDF 相关样品: 分组 自定义渲染器视图 动态调整行大小 让我们知道你对此的感受 最后更新:2016年3月 ListView除了基础之外,还有控制整体列表表现的选项ViewCell。选项包括:

2245

好例子网_Listview 数据项分组显示.rar

好例子网_Listview 数据项分组显示

android 自定义listview分组显示本地json格式数据

android 自定义listview分组显示本地json格式数据,主要是listview可以自定义成下拉刷新(此demo不包含上下拉,应用者自己完善),组头和组所属的数据的item点击事件是分开的

ListView分组显示

可以对ListView实现按照自己需求进行分组,比如像手机联系人那样,根据A、B、C、D等大写字母对联系人姓名进行分组显示。

保姆级跟学VISualstudio窗体画面制作教程

窗体也是对象,窗体类定义了生成窗体的模板,每实例化一个窗体类,就产生一个窗体。所有图像都将以相同的大小显示,该大小由ImageSize属性设置,较大的图像将所有至适当的尺寸。ImageList控件实际上就相当于一个图片集,也就是将多个图片存储到图片集中,当想要对某一图片进行操作时,只需根据其图片的编号,就可以找出该图片,并对其进行操作。当WordWrap(指示多行文本框控件在必要时是否自动换行到下一行的开始)属性为true时,则不论ScrollBars属性的值是什么,都不会显示水平滚动条。

KoError的博客 3853

(转载)如何将多种设计模式结合使用(有原代码)

原文来自:http://www.codeproject.com/Articles/6849/Design-Patterns-Implementation-in-a-Storage-Explor 介绍 目前已经有大部分关于“四人帮”设计模式的资料出版,然而大部分资料的例子都是按照某一种设计模式的方法设计单独完成的,而且这些例子的代码是不能和具有真正功能的实用程序相提并论的。本文的资源管理器程

享受开发技术,享受计算机科学 3232

使用CSharp开发数据应用系统

初始化windows程序 事件处理方法 this.close();关闭当前窗体 消息框 MessageBox.show(提示信息 窗体左上角提示 messageboxbuttons 提示按钮 okCancel,meessageboxicon 提示图标类型 Information) 窗体之间的跳转 被调用的窗体类名 窗体对象名称 = new 被调用的窗体类名(); 窗体对象名称.show(); 常用控件 button 按钮 textbox 文本框 combobox 组合框 lable 标签 MenuStr

掉头发是常事的博客 565

AndroidUI设计

1.View视图组件 类View是一个最基本的UI类,因为几乎所有的UI组件都是继承View来实现的,它的主要功能如下: (1)为指定的屏幕矩形区域存储布局和内容 (2)处理屏幕的尺寸和布局,绘制,焦点改变,翻屏,按键,手势。 (3)widght基类 android中常见的view类包括: 文本(TextView) 输入法(In

子东的专栏 729

Android ListView分类/分组效果

实现ListView分类显示效果,目前我知道的有两种方案: 每一个ItemView都包含用于显示分类信息的view(TitleView)和用于显示内容view(参考带索引的listview) 通过ListView加载不同类型的Item实现。本文属于这种实现方式 当前实现描述:与自定义Adapter的ListVIew雷同,只是多使用两个BaseAdapter API:public int getIte

lucasey的博客 5493
上一篇: ListView 显示柱状图,并解决滚动时内容重复的问题
下一篇: Eclipse安装插件长时间停留在calculating requirements and dependencies
紫竹芳菲
博客等级 码龄18年 50粉丝 15原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值