需求:现有这样一套原始数据{“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组织数据源的更多相关文章

  1. Android开发学习——ListView+BaseAdapter的使用

    ListView 就是用来显示一行一行的条目的MVC结构 * M:model模型层,要显示的数据           ----people集合 * V:view视图层,用户看到的界面          ...

  2. Android 如何在 ListView 中更新 ProgressBar 进度

    =======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...

  3. Android 长按Listview显示CheckBox,实现批量删除。

    ListView实现的列表,如果是可编辑,可删除的,一般都要提供批量删除功能,否则的话,一项一项的删除体验很不好,也给用户带来了很大的麻烦. 实现效果图 具体实现代码 select.xml 主布局文件 ...

  4. 【转】整理一下Android中的ListView

    原文网址:http://sunbofu.blog.51cto.com/6431507/1280441 Android中的listview目测是一个使用频率很高的组件,所以今天来总结一下listview ...

  5. 【Android基础】listview控件的使用(2)-------继承自ListActivity的普通listview

    由于listview在android控件中的重要性,所以android为我们直接封装了一个类ListviewActivity,直接将listview封装在了activity之中,在本篇中,我将介绍在L ...

  6. 【Android基础】listview控件的使用(1)------最简单的listview的使用

    listview控件是项目开发中最常用的空间之一,我将慢慢推出关于listview的一系列的文章,先从最简单的,系统自带的listview开始吧! 先上效果图: activity_one.xml &l ...

  7. Android复杂自定义Listview实现

    在Android中实现Listview对新人来说比较难以理解,本人看了若干文章后觉得可以使用以下思路来让新人更好理解(同时也做好记录,免得自己以后忘记). 可参考博客:http://cinderell ...

  8. Android UI学习 - ListView (android.R.layout.simple_list_item_1是个什么东西)

    Android UI学习 - ListView -- :: 标签:Android UI 移动开发 ListView ListActivity 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...

  9. Android RecyclerView与ListView比较

    RecyclerView 概述 RecyclerView 集成自 ViewGroup .RecyclerView是Android-support-V7版本中新增的一个Widgets,官方对于它的介绍是 ...

随机推荐

  1. POJO、JAVABEAN、*O、EJB

    POJO: 全称:Plain Old Java Object 解释:纯洁老式的java对象.从任何类继承.也没有实现任何接口,更没有被其它框架侵入的java对象 理解:通常我们常说的实体类 BEAN: ...

  2. 【读书笔记】iOS-网络-HTTP-URL结构

    http://user:password@hostname:port/absolute-path?query. http:  协议 user:password@   认证 hostname:  主机名 ...

  3. centos安装lamp

    http://bbs.qcloud.com/thread-1316-1-1.html 启动MySQL http://www.cnblogs.com/starof/p/4680083.html 修改密码 ...

  4. css 文本两行显示,超出省略号表示

     重点:text-overflow: ellipsis;只对display:inline:起作用 例子: <span class="a">我说说<b class= ...

  5. EasyUI 通过 Combobox 实现 AutoComplete 效果

    朋友在做一个web程序,用的EasyUI框架,让我帮忙实现一个自动提示功能.由于之前我也没用过EasyUI框架,就想到了jQueryUI有 AutoComplete 插件,就想直接拿过来用. 但当我将 ...

  6. SD从零开始51-54 信用控制范围, 信用范围数据维护, 自动信用控制, 信用控制-阻止后续功能

    [原创] SD从零开始51 信用控制范围 分散的组织结构Decentralized Organization 信用控制范围是一个为客户指定和控制信用限额的组织单元: 依赖于你公司的需求,应收款可以使用 ...

  7. Python网络爬虫笔记(一):网页抓取方式和LXML示例

    (一)   三种网页抓取方法 1.    正则表达式: 模块使用C语言编写,速度快,但是很脆弱,可能网页更新后就不能用了. 2.    Beautiful Soup 模块使用Python编写,速度慢. ...

  8. python基础一数据类型之字符串

    摘要: python基础一中有字符串,所以这篇主要讲字符串. 一,字符串的注释 二,字符串的索引与切片 三,字符串的方法 一,字符串的注释 单引号 双引号 三引号都可以用户定义字符串.三引号不仅可以定 ...

  9. Oracle EBS 查看双节点是否做了信任

    perl $AD_TOP/patch/115/bin/txkRunSSHSetup.pl verifyssh -contextfile=$CONTEXT_FILE -hosts=erpapp1,erp ...

  10. jboss eap 6.2 ear包 下使用log4j日志

    被jboss7/eap的日志问题搞死了,查了好多资料,都是war包的,基本上使用jboss-deployment-structure.xml放到WEB-INF下,文件内容如下: 是我总是没法成功,最后 ...