Android 给双ListView组织数据源
需求:现有这样一套原始数据{“A”,"B","C","D","B","A","B","C","A","B","D","D"}.
要求将此数据组织成为双列表形式显示,即将元素相同的数据分为一组,即{["A","A","A"],["B","B","B","B"],["C","C"],["D","D","D"]}并将分组后的数据显示在ListView界面上。(外部ListView显示每一组,内部ListView显示每一组中的组成员)
以下是需求效果展示图:

第一步:组织数据源(这一步也是我认为的最重要的一部,剩下的都是数据显示的问题,相信大家都会的,呵呵)
1.过滤数据(筛选出不重复数据)
2.将重复数据分别放入不同的集合中(小集合)
3.将重复数据集合放到大集合中(用于存放小集合)
4.代码展示:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set; /**
* 组织双列表的数据源
* @author yw-tony
*
*/
public class TwoListViewDataTools {
private TwoListViewDataTools(){}
private static TwoListViewDataTools instance;
public static TwoListViewDataTools getInstance(){
synchronized (TwoListViewDataTools.class) {
if(instance == null){
instance = new TwoListViewDataTools();
}
}
return instance;
}
/**
* 根据分组标记找出每一种元素在集合中的个数,并组织成为一个个的集合,然后存入共同的大集合中
* @param data原始数据
* @return
*/
public List<List<String>> listToGroup(List<String> data){
//最终集合的展现形式
List<List<String>> largeGroup = new ArrayList<List<String>>();
//筛选后的集合,此集合中存放的是原始集合中的不重复元素
List<String> diff = getListDifferentElement(data);
for(int i=0;i<diff.size();i++){//筛选后的集合
List<String> littleGroup = new ArrayList<String>();
for(int j= 0;j<data.size();j++){//原始集合
//如果遇到相同元素就存入元素集合中
if(diff.get(i).equals(data.get(j))){
littleGroup.add(data.get(j));
}
}
largeGroup.add(littleGroup);
}
return largeGroup;
}
/**
* 获取一个集合中不同元素的集合
* @param data 演示数据
*/
private List<String> getListDifferentElement(List<String> data){
//使用set集合可以过滤掉集合中的重复元素
Set<String> sets = new HashSet<String>();
List<String> diff = new ArrayList<String>();
for(int i=0;i<data.size();i++){
sets.add(data.get(i));
}
for(String s : sets){
diff.add(s);
}
return diff;
}
}
第二部:给列表填充数据(仅作代码展示,主要功能都加上了注释)
import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.BaseAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView; import com.yw.myapiupdate.R; /**
* 显示数据的主Activity类
* @author yw-tony
*
*/
public class ListViewTwoActivity extends Activity{
//分组后的集合
private List<List<String>> group = new ArrayList<List<String>>();
//原始数据集合
private List<String> datas = new ArrayList<String>();
private ListView lv_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lv_two_main);
/*初始化数据源*/
TwoListData.getInstance().addData(datas);
//给集合列表赋值
group = TwoListViewDataTools.getInstance().listToGroup(datas);
/*填充数据源*/
lv_main = (ListView)findViewById(R.id.lv_two_main_lv);
MainBaseAdapter adapter = new MainBaseAdapter(this);
adapter.setList(group);
lv_main.setAdapter(adapter);
//动态的计算列表的高度
setListViewHeightBasedOnChildren(lv_main);
}
/**
* 外层baseadapter
* @author yw-tony
*
*/
class MainBaseAdapter extends BaseAdapter{
private Context context;
private LayoutInflater inflater;
private List<List<String>> baseGroup = new ArrayList<List<String>>();
public MainBaseAdapter(Context context){
this.context = context;
this.inflater = LayoutInflater.from(context);
}
public void setList(List<List<String>> baseGroup){
this.baseGroup = baseGroup;
}
@Override
public int getCount() {
return baseGroup.size();
} @Override
public Object getItem(int arg0) {
return baseGroup.get(arg0);
} @Override
public long getItemId(int arg0) {
return arg0;
} @Override
public View getView(int arg0, View view, ViewGroup arg2) {
if(view == null){
view = inflater.inflate(R.layout.lv_two_main_item, null);
}
ListView lv_item = (ListView)view.findViewById(R.id.lv_two_main_item);
List<String> items = baseGroup.get(arg0);
//设置子listview的数据源,并显示出来
ItemBaseAdapter itemAdapter = new ItemBaseAdapter(ListViewTwoActivity.this);
itemAdapter.setList(items);
lv_item.setAdapter(itemAdapter);
//设置内层数据列表的高度
setListViewHeightBasedOnChildren(lv_item);
return view;
} }
/**
* 子(内层)listview的数据源
* @author yw-tony
*
*/
class ItemBaseAdapter extends BaseAdapter{
private Context context;
private LayoutInflater inflater;
private List<String> items = new ArrayList<String>();
public ItemBaseAdapter(Context context){
this.context = context;
this.inflater = LayoutInflater.from(context);
}
public void setList(List<String> items){
this.items = items;
}
@Override
public int getCount() {
return items.size();
} @Override
public Object getItem(int position) {
return items.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = inflater.inflate(R.layout.lv_two_item_item, null);
}
TextView tv = (TextView)convertView.findViewById(R.id.lv_two_item_item_tv);
tv.setText(items.get(position));
return convertView;
} }
/**动态改变listView的高度*/
public 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();
// totalHeight += 80;
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
// params.height = 80 * (listAdapter.getCount() - 1);
// params.height = 80 * (listAdapter.getCount());
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
((MarginLayoutParams) params).setMargins(0, 0, 0, 0);
listView.setLayoutParams(params); }
}
下面提出数据源(元数据)
import java.util.List;
/**
* 模拟从网络上获取到的数据源
* @author yw-tony
*
*/
public class TwoListData {
private TwoListData(){}
private static TwoListData instance;
public static TwoListData getInstance(){
synchronized (TwoListData.class) {
if(instance == null){
instance = new TwoListData();
}
}
return instance;
}
/**
* 添加模拟数据
*/
public void addData(List<String> data){
data.add("A");
data.add("B");
data.add("C");
data.add("B");
data.add("A");
data.add("C");
data.add("A");
data.add("B");
data.add("A");
} }
以下给出配置文件信息
1.主文件:
<?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:background="#ff0000"
android:orientation="vertical" >
<ListView
android:id="@+id/lv_two_main_lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
></ListView> </LinearLayout>
2.主文件的item
<?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" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#00ffff"
android:gravity="center"
>
<ListView
android:id="@+id/lv_two_main_item"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
></ListView>
</LinearLayout> </LinearLayout>
3.item的item
<?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" >
<TextView
android:id="@+id/lv_two_item_item_tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="测试"
android:textSize="25sp"
android:background="#33ffcc"/> </LinearLayout>
运行后的展示效果图:

Android 给双ListView组织数据源的更多相关文章
- Android开发学习——ListView+BaseAdapter的使用
ListView 就是用来显示一行一行的条目的MVC结构 * M:model模型层,要显示的数据 ----people集合 * V:view视图层,用户看到的界面 ...
- Android 如何在 ListView 中更新 ProgressBar 进度
=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...
- Android 长按Listview显示CheckBox,实现批量删除。
ListView实现的列表,如果是可编辑,可删除的,一般都要提供批量删除功能,否则的话,一项一项的删除体验很不好,也给用户带来了很大的麻烦. 实现效果图 具体实现代码 select.xml 主布局文件 ...
- 【转】整理一下Android中的ListView
原文网址:http://sunbofu.blog.51cto.com/6431507/1280441 Android中的listview目测是一个使用频率很高的组件,所以今天来总结一下listview ...
- 【Android基础】listview控件的使用(2)-------继承自ListActivity的普通listview
由于listview在android控件中的重要性,所以android为我们直接封装了一个类ListviewActivity,直接将listview封装在了activity之中,在本篇中,我将介绍在L ...
- 【Android基础】listview控件的使用(1)------最简单的listview的使用
listview控件是项目开发中最常用的空间之一,我将慢慢推出关于listview的一系列的文章,先从最简单的,系统自带的listview开始吧! 先上效果图: activity_one.xml &l ...
- Android复杂自定义Listview实现
在Android中实现Listview对新人来说比较难以理解,本人看了若干文章后觉得可以使用以下思路来让新人更好理解(同时也做好记录,免得自己以后忘记). 可参考博客:http://cinderell ...
- Android UI学习 - ListView (android.R.layout.simple_list_item_1是个什么东西)
Android UI学习 - ListView -- :: 标签:Android UI 移动开发 ListView ListActivity 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...
- Android RecyclerView与ListView比较
RecyclerView 概述 RecyclerView 集成自 ViewGroup .RecyclerView是Android-support-V7版本中新增的一个Widgets,官方对于它的介绍是 ...
随机推荐
- HDU3605(KB11-M 状态压缩+最大流)
Escape Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Unix环境高级编程:fork, vfork, clone
fork fork产生的子进程是传统意义上的进程,fork之后执行路径就互不关联了,一旦fork返回后面的代码就在不用的进程上下文中执行了.到底是子进程先执行还是父进程先执行一般是随机的或者依赖实现的 ...
- git 本地安装
一.基本安装 1.下载Git 官方地址为:https://git-scm.com/download/win 2.下载完之后,双击安装,全部选择默认. 3.选择安装目录 4.选择组件 5.开始菜单目 ...
- layui数据表格的td模板
1.常用操作模板 <script type="text/html" id="userbar"> <a class="layui-bt ...
- BZOJ4373: 算术天才⑨与等差数列(线段树 hash?)
题意 题目链接 Sol 正经做法不会,听lxl讲了一种很神奇的方法 我们考虑如果满足条件,那么需要具备什么条件 设mx为询问区间最大值,mn为询问区间最小值 mx - mn = (r - l) * k ...
- python邮件发送
'''qq邮件与其他邮件有所不同,下以我的qq邮件为例(切勿转载):''' import osimport smtplibfrom email.mime.text import MIMEText # ...
- css3 content 特殊字符和符号
基本形状 ▲ 9650 25B2 ► 9658 25BA ► 9658 25BA ▼ 9660 25BC◄ 9668 25C4 ❤ 10084 2764 ✈ 9992 2708 ★ 9733 2605 ...
- Js利用Canvas实现图片压缩
最近做的APP项目涉及到手机拍照上传图片,因为手机拍照的图片通常都比较大,所以上传的时候就会很慢.为此,需要对图片进行压缩处理来优化上传功能.以下是具体实现: /* * 图片压缩 * img 原始图片 ...
- Python+Selenium笔记(十五)调用JS
(一) 方法 方法 简单说明 execute_async_script(script, args) 异步执行JS代码 script:被执行的JS代码 args:js代码中的任意参数 execute_s ...
- CSS实现DIV从隐藏到展示的过渡效果
CSS中有很多功能强大的方法,其中过渡属性transition就很牛叉.你不用写一行JavaScript代码,随便写点css就可以实现一个动画效果.下面结合我在W3C网站上看到的实例,举个栗子说明下( ...