转载:http://blog.csdn.net/z_guijin/article/details/6630620
. 引言
在Android开发过程中往往有这样的需求,将ListView中的内容按年,月,日进行分类显示,要实现这样的效果我们可能有很多种方法,
如:多ListView拼合,自定义ListView组件等,下面介绍一种比较简单,而且实现结构清晰的实现方式,效果图及实现如下。
2. 效果图
3. 功能实现
(1) 主布局(main.xml)实现:
<?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/categoryList" android:layout_width = "fill_parent" android:layout_height = "fill_parent" /> </LinearLayout>
(2) 主Activity实现:
package com.flora; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class ListViewCategoryActivity extends Activity { private String [] mContacts = {"马英才", "张三", "李四"}; private String [] mMusic = {"素顔", "庐州月", "半城烟沙"}; private String [] mEBook = {"拆掉思维里的墙", "淡定力", "人脉决定命脉"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mCategoryAdapter.addCategory("人名", new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mContacts)); mCategoryAdapter.addCategory("音乐",new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mMusic)); mCategoryAdapter.addCategory("书籍",new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mEBook)); ListView categoryList = (ListView) findViewById(R.id.categoryList); categoryList.setAdapter(mCategoryAdapter); } private CategoryAdapter mCategoryAdapter = new CategoryAdapter() { @Override protected View getTitleView(String title, int index, View convertView, ViewGroup parent) { TextView titleView; if (convertView == null) { titleView = (TextView)getLayoutInflater().inflate(R.layout.title, null); } else { titleView = (TextView)convertView; } titleView.setText(title); return titleView; } }; }
(3) Adapter实现:
package com.flora; import java.util.ArrayList; import java.util.List; import android.view.View; import android.view.ViewGroup; import android.widget.Adapter; import android.widget.BaseAdapter; public abstract class CategoryAdapter extends BaseAdapter { private List<Category> categories = new ArrayList<Category>(); public void addCategory(String title, Adapter adapter) { categories.add(new Category(title, adapter)); } @Override public int getCount() { int total = 0; for (Category category : categories) { total += category.getAdapter().getCount() + 1; } return total; } @Override public Object getItem(int position) { for (Category category : categories) { if (position == 0) { return category; } int size = category.getAdapter().getCount() + 1; if (position < size) { return category.getAdapter().getItem(position-1); } position -= size; } return null; } @Override public long getItemId(int position) { return position; } public int getViewTypeCount() { int total = 1; for (Category category : categories) { total += category.getAdapter().getViewTypeCount(); } return total; } public int getItemViewType(int position) { int typeOffset = 1; for (Category category : categories) { if (position == 0) { return 0; } int size = category.getAdapter().getCount() + 1; if (position < size) { return typeOffset + category.getAdapter().getItemViewType(position - 1); } position -= size; typeOffset += category.getAdapter().getViewTypeCount(); } return -1; } @Override public View getView(int position, View convertView, ViewGroup parent) { int categoryIndex = 0; for (Category category : categories) { if (position == 0) { return getTitleView(category.getTitle(), categoryIndex,convertView, parent); } int size = category.getAdapter().getCount()+1; if (position < size) { return category.getAdapter().getView(position - 1, convertView, parent); } position -= size; categoryIndex++; } return null; } protected abstract View getTitleView(String caption,int index,View convertView,ViewGroup parent); }
(4) 分类ValueBean实现:
package com.flora; import android.widget.Adapter; public class Category { private String mTitle; private Adapter mAdapter; public Category(String title, Adapter adapter) { mTitle = title; mAdapter = adapter; } public void setTile(String title) { mTitle = title; } public String getTitle() { return mTitle; } public void setAdapter(Adapter adapter) { mAdapter = adapter; } public Adapter getAdapter() { return mAdapter; } }
(5) 分类Title实现:
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "match_parent" android:minHeight = "30dip" android:gravity = "center_vertical" android:paddingLeft = "10dip" android:background = "@color/title_background_color" />
有关于startActivityForResult():
父活动(caller)中有:
startActivityForResult(Intent,requestCode)//启动一个activity包含参数请求码和具体的intent数据,其中请求码可以用来识别子活动
onActivityResult(int requestCode, int resultCode, Intent data) //当子活动结束时(finish())时调用,在子活动中可以通过setResult(int resultCode, Intent data)来设定返回的结果码和intent数据。
子活动(subActivity)中有:
setResult(123, intent);//设定返回给启动该activity的caller的结果值和intent数据。
finish();//结束该方法,同时会调用caller的onActivityResult()方法
滚动条位置保存方法:
一、将当前listview的滚动条位置传递给子活动。
二、在子活动中重写onKeyDown()方法,监听单击back事件,并在其中将position值再传回给父活动。
三、在声明一个全局变量,在onActivityResult()中改变该变量的值,再在初始化列表的方法中使用该全局变量来设置列表的滚动条的当前位置。
注意:
一、该onActivityResult()方法是在onResume()方法之前调用的。
二、在父活动的onActivityResult()方法中是使用第一个参数requestCode识别返回的子活动的。我实验过不能用第二个参数resultCode识别返回的子活动,而且方法中的定义也是这么写,我猜resultCode应该表示一个子活动类别吧,而resultCode则表示这个类别中的一个元素。
RequestCode:The integer request code originally supplied to startActivityForResult(), allowing you to identify who this result came from.
下面的连接是本人编写翻译的老外的系列文,主要讲解了使用jquery mobile
搭配BDD测试框架jassmine进行开发一个简单的记事本,其中
http://tech.it168.com/a2011/0714/1218/000001218224_all.shtml )介绍了如何使用另外一个适合移动开发的Sencha Touch框架开发同样的一个记事本应用,有兴趣的读者可以进行学习。本文将介绍一个基于行为驱动模式开发(behavior-driven approach简称BDD)的框架Jasmine framework.(https://github.com/pivotal/jasmine/wiki ),在BDD开发中,我们将就每一个步骤都通过该开发框架来进行不断重构,以达到快速开发的目的。
下面是文章四部分的连接:
第一讲http://tech.it168.com/a2012/0111/1301/000001301499_all.shtml
第二讲 http://tech.it168.com/a2012/0302/1319/000001319223_all.shtml
第三讲 http://tech.it168.com/a2012/0130/1304/000001304764.shtml
第四讲 http://tech.it168.com/a2012/0209/1309/000001309674.shtml