推荐安卓开发神器(里面有各种UI特效和android代码库实例)
吸引用户的眼球,是我们至死不渝的追求;
第一时间呈现最有价值的信息,简明大方,告诉客户,你的选择是多么的明智,这正是你寻觅已久的东西。
分组的应用场合还是很多的,有数据集合的地方往往要分组显示;
分组的形式也很多,最常见的就是镶嵌在列表中,网上说的很多ExpandListView的也是一种。
Android自带的通讯录中的联系人是按照拼音首字母(A,B,C,D......)分组分类的,效果如下:
我们今天也是要实现这样类似的一个效果。
1.样本数据:
为了突出重点,直击要点,这里提供一个整理好的数据样本:
01 |
//list:数据集合 |
02 |
private List<String> list = new ArrayList<String>();
|
03 |
//listTag:Tag集合,其中Tag是分类的分割标签,每个分组的header |
04 |
private List<String> listTag = new ArrayList<String>();
|
05 |
|
06 |
public void setData(){
|
07 |
list.add( "A" );
|
08 |
listTag.add( "A" );
|
09 |
for ( int i= 0 ;i< 3 ;i++){
|
10 |
list.add( "阿凡达" +i);
|
11 |
}
|
12 |
list.add( "B" );
|
13 |
listTag.add( "B" );
|
14 |
for ( int i= 0 ;i< 3 ;i++){
|
15 |
list.add( "比特风暴" +i);
|
16 |
}
|
17 |
list.add( "C" );
|
18 |
listTag.add( "C" );
|
19 |
for ( int i= 0 ;i< 30 ;i++){
|
20 |
list.add( "查理风云" +i);
|
21 |
}
|
22 |
} |
2.Activity布局准备:
放置一个listView来呈现数据。
group_list_activity.xml:
01 |
<? xml version = "1.0" encoding = "utf-8" ?>
|
02 |
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
|
03 |
android:orientation = "vertical"
|
04 |
android:layout_width = "fill_parent"
|
05 |
android:layout_height = "fill_parent"
|
06 |
>
|
07 |
<!--简单的列表显示-->
|
08 |
< ListView android:id = "@+id/group_list" |
09 |
android:layout_width = "fill_parent" |
10 |
android:layout_height = "fill_parent"
|
11 |
android:cacheColorHint = "#00000000" />
|
12 |
</ LinearLayout >
|
3.自定义Adapter(本文继承ArrayAdapter):
这个是本文的重点和核心。
Adapter接口为数据和界面搭建了一个访问的桥梁,最重要的就是getView()方法,用这个方法我们可以实现一定程度的界面自定义。
ArrayAdapter间接实现了Adapter接口,这里我们简单起见,数据源只是提供单一的String数组。
01 |
private static class GroupListAdapter extends ArrayAdapter<String>{
|
02 |
//存放标签的列表,用来判断数据项的类型
|
03 |
//如果数据项在标签列表中,则是标签项,否则是数据项
|
04 |
private List<String> listTag = null ;
|
05 |
public GroupListAdapter(Context context, List<String> objects, List<String> tags) {
|
06 |
super (context, 0 , objects);
|
07 |
this .listTag = tags;
|
08 |
}
|
09 |
|
10 |
@Override
|
11 |
public View getView( int position, View convertView, ViewGroup parent) {
|
12 |
... ....
|
13 |
}
|
14 |
} |
我们来看看getView方法:
1 |
//该方法根据adapter的顺序一行一行的组织列表 |
2 |
//其中position表示第几行,也就是当前行在adapter的位置, |
3 |
//convertView表示第几行的View |
4 |
View getView( int position, View convertView, ViewGroup parent);
|
现在我们就是要重写getView方法,来实现列表中嵌入分组标签。
分组标签也是列表数据项之一,也是被一行一行的画上去的,但是它和其他数据项UI是不一致的,所以我们需要准备2套数据项布局模板:
数据项模板group_list_item.xml:
01 |
<? xml version = "1.0" encoding = "utf-8" ?>
|
02 |
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
|
03 |
android:orientation = "horizontal"
|
04 |
android:layout_width = "fill_parent"
|
05 |
android:layout_height = "wrap_content"
|
06 |
android:padding = "5dip" >
|
07 |
<!-- 图片和文字 -->
|
08 |
<!-- 随便放了一张图片,稍微美化一下 -->
|
09 |
< ImageView |
10 |
android:src = "@drawable/list_icon"
|
11 |
android:layout_width = "wrap_content"
|
12 |
android:layout_height = "wrap_content" />
|
13 |
< TextView
|
14 |
android:id = "@+id/group_list_item_text" |
15 |
android:layout_width = "wrap_content" |
16 |
android:layout_height = "fill_parent"
|
17 |
android:paddingLeft = "5dip"
|
18 |
android:gravity = "center_vertical" />
|
19 |
</ LinearLayout >
|
标签项模板group_list_item_tag.xml:
01 |
<!-- 只有文字,但是高度小店,背景色设置为555555灰色 --> |
02 |
<? xml version = "1.0" encoding = "utf-8" ?>
|
03 |
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
|
04 |
android:layout_width = "fill_parent"
|
05 |
android:layout_height = "wrap_content"
|
06 |
android:background = "#555555"
|
07 |
android:paddingLeft = "10dip" >
|
08 |
< TextView
|
09 |
android:id = "@+id/group_list_item_text" |
10 |
android:layout_width = "wrap_content" |
11 |
android:layout_height = "20dip"
|
12 |
android:textColor = "#ffffff"
|
13 |
android:gravity = "center_vertical" />
|
14 |
</ LinearLayout >
|
好,我们现在把这两个模板应用到getView方法中去:
01 |
@Override |
02 |
public View getView( int position, View convertView, ViewGroup parent) {
|
03 |
View view = convertView;
|
04 |
//根据标签类型加载不通的布局模板
|
05 |
if (listTag.contains(getItem(position))){
|
06 |
//如果是标签项
|
07 |
view = LayoutInflater.from(getContext()).inflate(R.layout.group_list_item_tag, null );
|
08 |
} else {
|
09 |
//否则就是数据项了
|
10 |
view = LayoutInflater.from(getContext()).inflate(R.layout.group_list_item, null );
|
11 |
}
|
12 |
//显示名称
|
13 |
TextView textView = (TextView) view.findViewById(R.id.group_list_item_text);
|
14 |
textView.setText(getItem(position));
|
15 |
//返回重写的view
|
16 |
return view;
|
17 |
} |
4.禁止标签项的响应事件:
在ArrayAdapter的父类BaseAdapter中提供了isEnable的()方法,我们看看这个方法:
1 |
//默认情况,如果这个方法不是分割符,返回true |
2 |
//分隔符是无选中和无点击事件的 |
3 |
//说白了,你想不想把改position项当做分隔符,想的话就返回false,否则返回true |
4 |
public boolean isEnabled ( int position)
|
这个方法刚好用来禁用标签项的响应事件。具体实现如下:
1 |
@Override |
2 |
public boolean isEnabled( int position) {
|
3 |
if (listTag.contains(getItem(position))){
|
4 |
return false ;
|
5 |
}
|
6 |
return super .isEnabled(position);
|
7 |
} |
现在标签项不会再有任何触控效果了,犹如一块死木板。
5.完整代码:
整个Activity和Adapter代码如下:
01 |
public class GroupListActivity extends Activity {
|
02 |
|
03 |
private GroupListAdapter adapter = null ;
|
04 |
private ListView listView = null ;
|
05 |
private List<String> list = new ArrayList<String>();
|
06 |
private List<String> listTag = new ArrayList<String>();
|
07 |
|
08 |
@Override
|
09 |
protected void onCreate(Bundle savedInstanceState) {
|
10 |
super .onCreate(savedInstanceState);
|
11 |
setContentView(R.layout.group_list_activity);
|
12 |
|
13 |
setData();
|
14 |
adapter = new GroupListAdapter( this , list, listTag);
|
15 |
listView = (ListView)findViewById(R.id.group_list);
|
16 |
listView.setAdapter(adapter);
|
17 |
}
|
18 |
|
19 |
public void setData(){
|
20 |
list.add( "A" );
|
21 |
listTag.add( "A" );
|
22 |
for ( int i= 0 ;i< 3 ;i++){
|
23 |
list.add( "阿凡达" +i);
|
24 |
}
|
25 |
list.add( "B" );
|
26 |
listTag.add( "B" );
|
27 |
for ( int i= 0 ;i< 3 ;i++){
|
28 |
list.add( "比特风暴" +i);
|
29 |
}
|
30 |
list.add( "C" );
|
31 |
listTag.add( "C" );
|
32 |
for ( int i= 0 ;i< 30 ;i++){
|
33 |
list.add( "查理风云" +i);
|
34 |
}
|
35 |
}
|
36 |
private static class GroupListAdapter extends ArrayAdapter<String>{
|
37 |
|
38 |
private List<String> listTag = null ;
|
39 |
public GroupListAdapter(Context context, List<String> objects, List<String> tags) {
|
40 |
super (context, 0 , objects);
|
41 |
this .listTag = tags;
|
42 |
}
|
43 |
|
44 |
@Override
|
45 |
public boolean isEnabled( int position) {
|
46 |
if (listTag.contains(getItem(position))){
|
47 |
return false ;
|
48 |
}
|
49 |
return super .isEnabled(position);
|
50 |
}
|
51 |
@Override
|
52 |
public View getView( int position, View convertView, ViewGroup parent) {
|
53 |
View view = convertView;
|
54 |
if (listTag.contains(getItem(position))){
|
55 |
view = LayoutInflater.from(getContext()).inflate(R.layout.group_list_item_tag, null );
|
56 |
} else {
|
57 |
view = LayoutInflater.from(getContext()).inflate(R.layout.group_list_item, null );
|
58 |
}
|
59 |
TextView textView = (TextView) view.findViewById(R.id.group_list_item_text);
|
60 |
textView.setText(getItem(position));
|
61 |
return view;
|
62 |
}
|
63 |
}
|
64 |
} |
6.最终效果:
相关推荐
为了解决这个问题,“ListView分组和字母导航”是一个很好的解决方案,它结合了分组显示和字母索引来优化用户体验。本文将详细介绍如何利用ListView和AlphabetIndexer辅助类实现这一功能。 首先,我们来理解“分组...
总结来说,实现Android的分组ListView并支持折叠功能,需要自定义数据结构和Adapter,处理好分组头和子项的视图类型,监听用户点击事件来切换分组状态,最后在Adapter中根据分组状态动态显示或隐藏子项。这个过程...
总结来说,WPF中的ListView分组和排序功能强大且灵活,可以通过数据模板、ItemsPanel、CollectionView和CollectionViewSource等组件进行定制。开发者可以根据具体需求选择合适的方法实现数据的展示、管理和操作,...
本篇将深入探讨ListView分组的实现,以及如何进行性能优化,并解决优化后可能出现的错位问题。 一、ListView分组实现 ListView的分组功能可以通过自定义Adapter实现。首先,我们需要创建一个适配器,它需要继承自...
总结,实现“android 自定义listview分组显示本地json格式数据”需要完成以下步骤:解析本地JSON数据、创建自定义Adapter、处理点击事件以及设置HeaderListView。通过这样的方式,我们可以在Android应用中构建出一个...
`ListView分组显示`是ListView功能的一个拓展,它允许我们将数据按照特定规则进行分类,形成分组的效果,提高用户浏览和查找数据的效率。这个功能在很多场景下都非常实用,比如通讯录应用中的联系人按字母排序分组,...
在标题“android listview分组滑动悬浮”中,提到的功能是ListView的一种高级用法,即实现分组列表并且在滑动过程中对隐藏的分组显示悬浮条。这种设计可以提高用户体验,使用户能够快速定位到特定的分组。 首先,...
这个自定义的"listview分组title可固定可移动"功能就是针对这样的需求设计的。 首先,我们需要理解分组ListView的基本概念。在ListView中,数据通常是以Adapter的形式绑定的,而分组ListView则需要一个特殊的...
对ListView实现分组分类显示, 并且点击相应的分组会展开和收缩。具体可以参考下http://blog.csdn.net/wuyuxing24/article/details/49520883 里面的描述。
这个"listView分组,顶部显示组信息"的功能实现,涉及到的主要知识点包括ListView的自定义适配器、滚动监听以及布局管理。 1. **自定义适配器**: ListView的默认适配器是ArrayAdapter或CursorAdapter,但它们通常...
标题“listview 分组显示+可展开分组+每个item可左右滑动”和描述“listview 分组显示+可展开分组+每个item可左右滑动+多级分组”揭示了几个关键的实现需求: 1. **分组显示**:ListView可以被组织成多个分组,每个...
1. **ListView分组基础** ListView的分组功能主要通过使用ExpandableListView实现,这是一个可扩展的ListView,支持子项的展开和折叠。与普通ListView不同,ExpandableListView允许你创建层次结构的数据展示,这...
ListView分组通常用于展示具有层次结构的数据。例如,一个联系人应用可能按字母顺序分组显示联系人。在Android中,我们可以使用ExpandableListView来实现分组,但这里讨论的是在普通ListView中实现分组。 1. 数据...
ListView的分组功能允许用户按特定规则对数据进行组织,提高数据可视化的清晰度和易用性。本篇将深入探讨`ListView`在C#中的分组实现,并结合提供的WpfApplication4示例进行详细讲解。 首先,让我们理解`ListView`...
本文将深入探讨如何利用Adapter来实现ListView的分组功能,并重点讲解`getItemViewType`和`getViewTypeCount`这两个关键方法,以及如何通过ViewHolderUtils简化代码。 首先,`getItemViewType`方法是Adapter的一个...
标题中的“listview分组”指的是对ListView进行定制,使其能够显示有层次的数据。在描述中提到的“分组的listview”,进一步强调了我们将在一个ListView中实现对数据的分组展示。 在Android中,实现分组ListView的...
在提供的`Day16.txt`和`Day16_listview_1(分块显示)`文件中,可能包含了关于如何实现ListView分组显示的代码示例或详细教程。你可以参考这些文件进一步学习和实践。 总的来说,ListView的分组显示是一个结合了数据...
首先,我们要明白ListView分组的核心在于自定义适配器(Adapter)。在适配器中,我们需要处理不同类型的数据项,通常分为组头(Group Header)和组内的子项(Child Items)。在`getView()`方法中,根据数据类型返回...
"GroupListView_demo.zip"、"GroupableListView_src.zip"以及"GroupableListView_demo.zip"这3个文件名,很可能对应着不同的ListView分组实现方法的源代码或演示项目。下面将详细解释ListView数据分组的基本概念和...