App列表之分组ListView

吸引用户的眼球,是我们至死不渝的追求;
      第一时间呈现最有价值的信息,简明大方,告诉客户,你的选择是多么的明智,这正是你寻觅已久的东西。

分组的应用场合还是很多的,有数据集合的地方往往要分组显示;
      分组的形式也很多,最常见的就是镶嵌在列表中,网上说的很多ExpandListView的也是一种。
      Android自带的通讯录中的联系人是按照拼音首字母(A,B,C,D......)分组分类的,效果如下:
      我们今天也是要实现这样类似的一个效果。

1.样本数据:
      为了突出重点,直击要点,这里提供一个整理好的数据样本:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

//list:数据集合

private List<String> list = new ArrayList<String>();

//listTag:Tag集合,其中Tag是分类的分割标签,每个分组的header

private List<String> listTag = new ArrayList<String>();

public void setData(){

        list.add("A");

        listTag.add("A");

        for(int i=0;i<3;i++){

            list.add("阿凡达"+i);

        }

        list.add("B");

        listTag.add("B");

        for(int i=0;i<3;i++){

            list.add("比特风暴"+i);

        }

        list.add("C");

        listTag.add("C");

        for(int i=0;i<30;i++){

            list.add("查理风云"+i);

        }

}

2.Activity布局准备:
      放置一个listView来呈现数据。
      group_list_activity.xml:


1

2

3

4

5

6

7

8

9

10

11

12

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    <!--简单的列表显示-->

    <ListView android:id="@+id/group_list"

       android:layout_width="fill_parent"

       android:layout_height="fill_parent"

       android:cacheColorHint="#00000000"/>

</LinearLayout>

3.自定义Adapter(本文继承ArrayAdapter):
     这个是本文的重点和核心。 
     Adapter接口为数据和界面搭建了一个访问的桥梁,最重要的就是getView()方法,用这个方法我们可以实现一定程度的界面自定义。
     ArrayAdapter间接实现了Adapter接口,这里我们简单起见,数据源只是提供单一的String数组。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

private static class GroupListAdapter extends ArrayAdapter<String>{

    //存放标签的列表,用来判断数据项的类型

    //如果数据项在标签列表中,则是标签项,否则是数据项

    private List<String> listTag = null;

    public GroupListAdapter(Context context, List<String> objects, List<String> tags) {

        super(context, 0, objects);

        this.listTag = tags;

    }

    

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        ... ....

    }

}

我们来看看getView方法:


1

2

3

4

//该方法根据adapter的顺序一行一行的组织列表

//其中position表示第几行,也就是当前行在adapter的位置,

//convertView表示第几行的View

View getView(int position, View convertView, ViewGroup parent);

现在我们就是要重写getView方法,来实现列表中嵌入分组标签。
     分组标签也是列表数据项之一,也是被一行一行的画上去的,但是它和其他数据项UI是不一致的,所以我们需要准备2套数据项布局模板:
     数据项模板group_list_item.xml:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:padding="5dip">

    <!-- 图片和文字 -->

    <!-- 随便放了一张图片,稍微美化一下 -->

    <ImageView

       android:src="@drawable/list_icon"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"/>

    <TextView

       android:id="@+id/group_list_item_text"

       android:layout_width="wrap_content"

       android:layout_height="fill_parent"

       android:paddingLeft="5dip"

       android:gravity="center_vertical"/>

</LinearLayout>

标签项模板group_list_item_tag.xml:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

<!-- 只有文字,但是高度小店,背景色设置为555555灰色 -->

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:background="#555555"

    android:paddingLeft="10dip">

    <TextView

       android:id="@+id/group_list_item_text"

       android:layout_width="wrap_content"

       android:layout_height="20dip"

       android:textColor="#ffffff"

       android:gravity="center_vertical"/>

</LinearLayout>

好,我们现在把这两个模板应用到getView方法中去:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Override

public View getView(int position, View convertView, ViewGroup parent) {

    View view = convertView;

    //根据标签类型加载不通的布局模板

    if(listTag.contains(getItem(position))){

        //如果是标签项

        view = LayoutInflater.from(getContext()).inflate(R.layout.group_list_item_tag, null);

    }else{             

        //否则就是数据项了     

        view = LayoutInflater.from(getContext()).inflate(R.layout.group_list_item, null);

    }

    //显示名称

    TextView textView = (TextView) view.findViewById(R.id.group_list_item_text);

    textView.setText(getItem(position));

    //返回重写的view

    return view;

}

 4.禁止标签项的响应事件:
      在ArrayAdapter的父类BaseAdapter中提供了isEnable的()方法,我们看看这个方法:


1

2

3

4

//默认情况,如果这个方法不是分割符,返回true

//分隔符是无选中和无点击事件的

//说白了,你想不想把改position项当做分隔符,想的话就返回false,否则返回true

public boolean isEnabled (int position)

这个方法刚好用来禁用标签项的响应事件。具体实现如下:


1

2

3

4

5

6

7

@Override

public boolean isEnabled(int position) {

    if(listTag.contains(getItem(position))){

        return false;

    }

    return super.isEnabled(position);

}

现在标签项不会再有任何触控效果了,犹如一块死木板。

5.完整代码:
      整个Activity和Adapter代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

public class GroupListActivity extends Activity {

    

    private GroupListAdapter adapter = null;

    private ListView listView = null;

    private List<String> list = new ArrayList<String>();

    private List<String> listTag = new ArrayList<String>();

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.group_list_activity);

        

        setData();

        adapter = new GroupListAdapter(this, list, listTag);

        listView = (ListView)findViewById(R.id.group_list);

        listView.setAdapter(adapter);

    }

    public void setData(){

        list.add("A");

        listTag.add("A");

        for(int i=0;i<3;i++){

            list.add("阿凡达"+i);

        }

        list.add("B");

        listTag.add("B");

        for(int i=0;i<3;i++){

            list.add("比特风暴"+i);

        }

        list.add("C");

        listTag.add("C");

        for(int i=0;i<30;i++){

            list.add("查理风云"+i);

        }

    }

    private static class GroupListAdapter extends ArrayAdapter<String>{

        

        private List<String> listTag = null;

        public GroupListAdapter(Context context, List<String> objects, List<String> tags) {

            super(context, 0, objects);

            this.listTag = tags;

        }

        

        @Override

        public boolean isEnabled(int position) {

            if(listTag.contains(getItem(position))){

                return false;

            }

            return super.isEnabled(position);

        }

        @Override

        public View getView(int position, View convertView, ViewGroup parent) {

            View view = convertView;

            if(listTag.contains(getItem(position))){

                view = LayoutInflater.from(getContext()).inflate(R.layout.group_list_item_tag, null);

            }else{                   

                view = LayoutInflater.from(getContext()).inflate(R.layout.group_list_item, null);

            }

            TextView textView = (TextView) view.findViewById(R.id.group_list_item_text);

            textView.setText(getItem(position));

            return view;

        }

    }

}

6.最终效果:

时间: 2024-10-25 15:12:56

App列表之分组ListView的相关文章

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快

App列表之游标ListView(索引ListView)

游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1.游标(Fast scroll thumb)      就是右边的那个拖动的方块,这个非常的简单: 1 2 3 4 5 <ListView     android:id="@+id/tweaked_list"     android:layout_width="fill_pa

Android学习系列(15)--App列表之游标ListView(索引ListView)

游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1.游标(Fast scroll thumb)      就是右边的那个拖动的方块,这个非常的简单: 1 2 3 4 5 <ListView     android:id="@+id/tweaked_list"     android:layout_width="fill_pa

App列表之下拉刷新

Android的ListView是应用最广的一个组件,功能强大,扩展性灵活(不局限于ListView本身一个类),前面的文章有介绍分组,拖拽,3D立体,游标,圆角,而今天我们要介绍的是另外一个扩展ListView:下拉刷新的ListView.    下拉刷新界面最初流行于iphone应用界面,如图: 然后在Android中也逐渐被应用,比如微博,资讯类.    所以,今天要实现的结果应该也是类似的,先贴出最终完成效果,如下图,接下来我们一步一步实现. 1. 流程分析    下拉刷新最主要的流程是

【Android】11.0 UI开发(三)——列表控件ListView的简单实现2

1.0 由于书上内容,已经和实际编程的兼容性已经不太友好,重写了项目,用于进一步学习列表控件ListView. 2.0 新建项目ListViewTest,其中文件目录如下: 3.0 ActivityCollector.java package com.example.listviewtest; import android.app.Activity; import java.util.ArrayList; import java.util.List; public class ActivityC

[iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表&quot;练习)

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

从下拉菜单拖拽一个元素 出来,插入到页面中的app 列表中

1,实现功能:从下拉菜单拖拽一个元素 出来,插入到页面中的app 列表中 并实现app向后移动一个元素的位置: 2.实现思路: 01.遍历下拉菜单,添加拖拽方法,实现位置移动功能: 02.遍历app列表,将app位置存为数组,进行循环: 03.拖拽元素与当前app做碰撞检测: 04.如果鼠标在app内部,则将拖拽元素添加到当前app之后,位置设置为当前 i 的值: 参考代码如下: <!doctype html> <html lang="en"> <head

【Visual Basic】列表控件ListView的增删改查、模态对话框、禁止窗口调整大小

列表控件ListView是窗体中核心组件之一,在各种窗体程序得到广泛应用.在<[mfc]学生信息管理,实现List控件节点的增删改查>(点击打开链接)中极其难以实现列表控件ListView的增删改查,在vb中可以轻松实现,下面举一个列子来说明这个问题. 如上图的一个ListView控件,点击"添加"按钮,在弹出的模态窗口,可以为ListView控件添加相应的项. 通过"删除"按钮可以删除选中的项.通过"修改"按钮,选中的项的值将会传递

使用朴素贝叶斯算法,通过用户安装的APP列表来推测用户的性别

从本质上来说,这是一个分类问题,类似于通过邮件内容来推测垃圾邮件,通过用户的相关信息来推测用户是否会拖欠贷款,而通过用户的APP安装列表来推测用户的性别也是一个类似的问题. 对于贝叶斯算法来说,我们首先需要一个训练集数据,这个训练集是一个已经打好标签的数据.而要对一堆的数据打标签,人工来做是不太合适的,在这里需要结合人类与计算机各自的优势,来半自动化的识别出比较明显的有性别倾向的APP的列表,再通过这些(有性别标识的)APP在用户的安装列表中所占的比例来判定出性别特征比较明显的用户,并为这些用户