本文介绍日期列表界面的布局以及相关动作的定义。
顾名思义,日期列表界面就是以列表的形式来显示datelist表中的条目,包括日期、该日期的总便签数以及总完成数。
一 界面布局
日期列表界面类继承了ListActivity类,根据google android参考手册的介绍,ListActivity类是一个ListView的宿主,并提供了相关事件处理的接口。
ListActivity类默认提供了一个布局,这个布局是一个位于屏幕中央的全屏的列表(id为@android:id/list)。如果列表没有数据,你可以显示一个“empty list”的通知(id为android:empty),而且这时你可以显示任意类型的组件。
有时,我们需要定义自己的ListActivity的布局,那么这个布局仍然要包含一个id为@android:id/list的ListView对象和一个id为@android:empty的TextView。如下:
除了定义全屏的布局之外,我们还必须定义每个列表行的布局,如下:
除了布局之外,由于在布局的xml文件中,我们要使用到一些命名的字符串常量,所以我们也必须在res/values/strings.xml文件中定义这些常量。如下:
二 代码说明
定义好界面布局之后,就可以编写代码了。下面是日期列表界面的实现类:
下面说明一些细节。
fillData这个方法主要是从datelist表中获取数据并填充到日期列表界面中。从上面看到的,使用了一个SimpleCursorAdapter适配器来作为ListView的数据源。根据google android参考手册,SimpleCursorAdapter的简介如下:
SimpleCursorAdapter是一个用于映射游标的列到XML文件中定义的TextViews或者ImageViews的适配器。你可以指定你要显示的列以及显示的相对应的views,还可以指定显示这些views的布局(其实,就是一个列表中的行的布局)。绑定布局和数据源有两种方式。第一种,如果SimpleCursorAdapter.ViewBinder可用,那么就调用setViewValue(android.view.View,android.database.Cursor,int)来进行绑定。如果返回值为true,那么绑定成功。如果返回false,且指定的组件式TextView,那么就调用setViewText(TextView, String)来指定绑定失败要显示的值,如果指定的组件是ImageView,那么就调用setViewImage(ImageView,String)来指定显示的值。If no appropriate binding can be found, an IllegalStateException
is thrown这一句说的应该是指SimpleCursorAdapter.ViewBinder不可用的情况下进行绑定发生的情况吧。下面这一句说的还没学习到,不敢乱说,原文奉上,先Mark。
If this adapter is used with filtering, for instance in an AutoCompleteTextView
, you can use the SimpleCursorAdapter.CursorToStringConverter
and the FilterQueryProvider
interfaces to get control over the filtering process. You can refer to convertToString(android.database.Cursor)
and runQueryOnBackgroundThread(CharSequence)
for more information.
在fillData这个方法中,我们指定了mmdate/mmtotal/mmcomp列分别绑定到R.id.text_date/R.id.text_total/R.id.text_complete三个TextView中。并指定了date_row.xml这个文件定义的布局为行的布局。
这段代码主要定义了上下文菜单,也就是我们在某一个列表项上长按2秒后弹出的菜单。onCreateContextMenu添加一个菜单项,而onContextItemSelected则响应用户的点击事件。
MenuItem.getItemId这个方法返回用户点击的菜单项的id,这个id是我们在插入菜单项时指定的。
MenuItem.getMenuInfo返回的是我们所点击的view设置的附加信息,在ListActivity中我们绑定游标到ListView时,会将游标中的rowid设置进去。这个rowid列名是“_id”,所以我们创建表时也使用这个默认的列名。AdapterContextMenuInfo类中会包含“_id”的值。之后,我们获取到的信息中会返回这个rowid,那么我们就可以利用这个rowid进行相关的数据库操作。
这一段代码也是创建菜单,当我们按下手机上的“Menu”键的时候就会弹出该菜单。
当用户点击列表行上的view的时候就会调用该函数进行处理。
当用户点击日期列表界面上的行时,就会跳转到memo的列表界面,显示该日期对应的所有memo。所以,我们必须传递我们所点击的行所对应的rowid给memo列表界面。这儿调用Intent.putExtra来设置我们所要传递的值。
我们进行Activity的跳转时使用的是startActivityForResult,那么当我们在新的Activity上完成工作之后回到当前的Activity会返回一个结果值,当前的Activity会调用onActivityResult进行处理。这儿,我们让界面重新显示所有的日期列表项。
本文中,主要涉及到日期列表的显示、上下文菜单的创建、菜单的创建、列表项点击的处理以及处理另外一个Activity返回结果这几个方面。如果开发其他程序可以依此类推。