前几天,和ios开发的同事扯淡时发现iphone里有个sectionlistview,分章节的列表。android中的联系人也有这种效果,首字母相同的联系人会被分在一个章节中。

后来搜了一下,android做起来也很easy。下面记录一下方便以后参考(大家改一下包名)


首先复写一下BaseAdapter:

package com.test.activity;import java.util.LinkedHashMap;import java.util.Map;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.Adapter;import android.widget.ArrayAdapter;import android.widget.BaseAdapter;public class SeparatedListAdapter extends BaseAdapter {public final Map<String, Adapter> sections = new LinkedHashMap<String, Adapter>();public final ArrayAdapter<String> headers;public final static int TYPE_SECTION_HEADER = 0;public SeparatedListAdapter(Context context) {headers = new ArrayAdapter<String>(context, R.layout.list_header);}public void addSection(String section, Adapter adapter) {this.headers.add(section);this.sections.put(section, adapter);}public Object getItem(int position) {for (Object section : this.sections.keySet()) {Adapter adapter = sections.get(section);int size = adapter.getCount() + 1;// check if position inside this sectionif (position == 0)return section;if (position < size)return adapter.getItem(position - 1);// otherwise jump into next sectionposition -= size;}return null;}public int getCount() {// total together all sections, plus one for each section headerint total = 0;for (Adapter adapter : this.sections.values())total += adapter.getCount() + 1;return total;}public int getViewTypeCount() {// assume that headers count as one, then total all sectionsint total = 1;for (Adapter adapter : this.sections.values())total += adapter.getViewTypeCount();return total;}public int getItemViewType(int position) {int type = 1;for (Object section : this.sections.keySet()) {Adapter adapter = sections.get(section);int size = adapter.getCount() + 1;// check if position inside this sectionif (position == 0)return TYPE_SECTION_HEADER;if (position < size)return type + adapter.getItemViewType(position - 1);// otherwise jump into next sectionposition -= size;type += adapter.getViewTypeCount();}return -1;}public boolean areAllItemsSelectable() {return false;}public boolean isEnabled(int position) {return (getItemViewType(position) != TYPE_SECTION_HEADER);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {int sectionnum = 0;for (Object section : this.sections.keySet()) {Adapter adapter = sections.get(section);int size = adapter.getCount() + 1;// check if position inside this sectionif (position == 0)return headers.getView(sectionnum, convertView, parent);if (position < size)return adapter.getView(position - 1, convertView, parent);// otherwise jump into next sectionposition -= size;sectionnum++;}return null;}@Overridepublic long getItemId(int position) {return position;}}

然后开始写主Act,用listview适配一下上面的adapter

package com.test.activity;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.SimpleAdapter;public class ListSample extends Activity {public final static String ITEM_TITLE = "title";public final static String ITEM_CAPTION = "caption";public Map<String, ?> createItem(String title, String caption) {Map<String, String> item = new HashMap<String, String>();item.put(ITEM_TITLE, title);item.put(ITEM_CAPTION, caption);return item;}@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);List<Map<String, ?>> security = new LinkedList<Map<String, ?>>();security.add(createItem("Remember passwords","Save usernames and passwords for Web sites"));security.add(createItem("Clear passwords","Save usernames and passwords for Web sites"));security.add(createItem("Show security warnings","Show warning if there is a problem with a site's security"));// create our list and custom adapterSeparatedListAdapter adapter = new SeparatedListAdapter(this);adapter.addSection("Array test", new ArrayAdapter<String>(this,R.layout.list_item, new String[] { "First item", "Item two" }));adapter.addSection("Security", new SimpleAdapter(this, security,R.layout.list_complex,new String[] { ITEM_TITLE, ITEM_CAPTION }, new int[] {R.id.list_complex_title, R.id.list_complex_caption }));ListView list = new ListView(this);list.setAdapter(adapter);this.setContentView(list);}}
这样java代码就写完了。。

最后把xml布局文件粘贴一下就可以跑起来了

<!-- list_complex.xml -->  <LinearLayout      xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:orientation="vertical"      android:paddingTop="10dip"      android:paddingBottom="10dip"      android:paddingLeft="15dip"      >      <TextView          android:id="@+id/list_complex_title"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:textAppearance="?android:attr/textAppearanceLarge"          />      <TextView          android:id="@+id/list_complex_caption"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:textAppearance="?android:attr/textAppearanceSmall"          />  </LinearLayout>  

<!-- list_header.xml -->  <TextView      xmlns:android="http://schemas.android.com/apk/res/android"      android:id="@+id/list_header_title"      android:layout_width="fill_parent"       android:layout_height="wrap_content"      android:paddingTop="2dip"      android:paddingBottom="2dip"      android:paddingLeft="5dip"      style="?android:attr/listSeparatorTextViewStyle" /> 

<!-- list_item.xml -->  <TextView      xmlns:android="http://schemas.android.com/apk/res/android"      android:id="@+id/list_item_title"      android:layout_width="fill_parent"       android:layout_height="fill_parent"      android:paddingTop="10dip"      android:paddingBottom="10dip"      android:paddingLeft="15dip"      android:textAppearance="?android:attr/textAppearanceLarge"      />  

更多相关文章

  1. 简单 4部 完成 android 二维码扫一扫功能(5分钟实现)
  2. 【Android(安卓)Training UI】创建自定义Views(Lesson 0 - 章节
  3. Android(安卓)初步
  4. Android异步加载全解析之开篇瞎扯淡
  5. 【Android(安卓)Training - 04】保存数据 [ Lesson 0 - 章节概览
  6. android官网图像与动画章节demo的分析
  7. Android学习笔记(9)————Android的三种Menu用法
  8. 五.在Android中实现线程的方法
  9. 最好的Android学习材料

随机推荐

  1. Android应用于军事制造业,开放性优势受青
  2. android wifi设置
  3. Android(安卓)Binder 机制初步学习 笔记(
  4. Android(安卓)开发中C++链接C库
  5. Android Studio共用Eclipse的Android项目
  6. HNU_团队项目_Android和数据库对接出现问
  7. Android API中常用的包
  8. 使用Android(安卓)sdk/build-tools/dx工
  9. Android 渗透测试学习手册(七)不太知名的 A
  10. Android必备知识(五)多线程及AsyncTask