ListActivity与Adapter以及SQLite的使用
Posted wangziqiang123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ListActivity与Adapter以及SQLite的使用相关的知识,希望对你有一定的参考价值。
摘要
ListActivity、AdapterView、适配器、多个活动、SQLite、GUI样式、菜单资源及MenuInflater。
使用style.xml文件定义style元素
资源文件都使用<resources>标签,style元素使用<style>标签。与此类似的所有的属性都可以放在style里面定义,
<resources>
<style name="SomeStyle">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">center</item>
<item name="android:layout_margin">5dpt</item>
<item name="android:background">@drawable/somebackground</item>
<item name="android:textColor">@android:color/white</item>
</style>
</resources>
在view中使用定义的style
<view
style="@style/SomeStyle"/>
在XML中用menu资源定义应用的MenuItem
每一个menu资源XML文件都包含一个根menu元素,里面嵌套的每一个item都代表一个MenuItem。需要为每一个item指定一个android:id属性,以便能够在程序中用对应的MenuItem交互。其他的item属性还包括:
- android:title和android:titleCondensed表示标题文本和如果显示不了完整的情况下显示的紧凑型标题文本。
- android:icon指定一个Drawable属性,表示显示的图片。
- andorid:orderInCategory决定MenuItem出现的顺序。
下面是示例代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/item1"
android:title="item1"
android:icon="@drawable/item1"
android:titleCondensed="1"
android:orderInCategory="1">
</item>
<item android:id="@+id/item2"
android:title="item2"
android:icon="@drawable/item2"
android:titleCondensed="2"
android:orderInCategory="2">
</item>
</menu>
代码end
ListActivity类和ListView
ListActivity是只包含一个ListView的类。可以使用CursorAdapter作为适配器填充ListView。并且ListActivity是内置ListView。ListView需要设置adapter和OnItemClickListener。同时要使用SimpleCursorAdapter,必须先定义两个数组,分别包含需要映射成GUI组件的列名称及GUI组件的资源ID。SimpleCursorAdapter的构造函数接收如下参数:
- 运行ListView所在的Context
- 用来显示ListView中每一项的布局的资源ID
- 提供数据访问的Cursor,可以提供null,并且在后面指定它
- 包含要显示的列名称的String数组
- 包含对应的GUI资源ID的int数组
实例代码如下:
ListView lv=getListView();
lv.setOnitemClickListener(viewListener);
String[] from=new String[]{"name"};
int[] to=new int[]{R.id.to};
CursorAdapter mAdapter=new SimpleCursorAdapter(this,R.layout.listview,null,from,to);
setListAdapter(mAdapter);
当Cursor类不再需要时
Cursor cursor=mAdapter.getCursor();
if(cursor!=null){
cursor.deactivate();
}
mAdapter.changeCursor(null);
AsyncTask的使用方法
创建一个新的AsyncTask,并且执行它。AsyncTask会在一个单独的线程中执行任务,这里的execute方法的实参表明任务不会接收任何实参,这个方法会接收可变数量的实参,随后它们作为实参被传递给人物的doInBackground方法。每次执行如下方法,都会创建一个新的AsyncTask对象,因为每一个AsyncTask只能执行一次,所以这样是必须的。
AsyncTask是一个要求三个参数的泛型类型:
- 第一个参数是变长参数表的类型,用于AsyncTask的doInBackground方法。当调用execute方法,doInBackground方法会在一个单独执行线程中执行任务。
- 第二个参数是变长参数表的类型,用于AsyncTask的onProgressUpdate方法。这个方法在GUI线程中执行,并用来从长时间运行的任务中接收特定类型的过渡性更新数据。
- 第三个参数是任务结果的类型,它会被传递给AsyncTask的onPostExecute方法。
doInBackground方法使用databaseConnector来打开数据库连接。
private class GetTask extends AsyncTask<Object, Object, Cursor>{
DatabaseConnector databaseConnector = new DatabaseConnector(AddressBook.this);
@Override
protected Cursor doInBackgroudn(Object... params){
databaseConnector.open();
return databaseConnector.getAllContacts();
}
@Override
protected void onPostExecute(Cursor result){
contactAdapter.changeCursor(result);
dat 大专栏 ListActivity与Adapter以及SQLite的使用abaseConnector.close();
}
}
创建新的AsyncTask,并执行它。
Bundle extras = getIntent().getExtras();
rowID = extras.getLong("row_id");
new GetTask().execute(rowID);
重写onCreateOptionsMenu和onOptionsItemSelected,使用MenuInflater
使用MenuInflater填充菜单。
@Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.address_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
Intent addNew = new Intent(this, EditActivity.class);
startActivity(addNew);
return super.onOptionsItemSelected(item);
}
实现OnItemClickListener接口
Menu的OnItemClickListener方法的参数
- 与用户交互的AdapterView引用
- 点触的列表项的根View的引用
- ListView中点触的列表项的索引
- 所选择列表项的唯一long类型的ID,这里即为Cursor中的行ID
下面是示例代码
OnItemClickListener viewContactListener=new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3){
Intent viewContact=new Intent(this, ViewContact.class);
viewContact.putExtra(ROW_ID, arg3);
startActivity(viewContact);
}
}
代码end
DatabaseConnector的实用工具类
实用DatabaseConnector工具类管理与SQLite的交互。
public class DatabaseConnector{
private SQLiteDatabase database;
private DatabaseOpenHelper databaseOpenHelper;
public DatabaseConnector(Context context){
databaseOpenHelper-new DatabaseOpenHelper(context, DATABASE_NAME, null, 1);
}
public void open() throws SQLException{
database=databaseOpenHelper.getWritableDatabase();
}
public void close(){
if(database!=null){
database.close();
}
}
public void insertContact(String name, String phone){
ContentValues newContact=new ContentValues();
newContact.put("name", name);
newContact.put("phone", phone);
open();
database.insert("contacts", null, newContact);
close();
}
public void updateContact(long id, String name, String phone){
ContentValues editContact=new ContentValues();
editContact.put("name", name);
editContact.put("phone", phone);
open();
database.update("contacts", editContact, "_id="+id, null);
close();
}
publci Cursor getAllContacts(){
return database.query("contacts", new String[]{"_id", "name"}, null, null, null, null, "name");
}
public Cursor getOneContact(long id){
return database.query("contacts", null, "_id="+id, null, null, null, null);
}
public void deleteContact(long id){
open();
database.delete("contacts", "_id="+id, null);
close();
}
}
getAllContacts方法使用SQLiteDatabase的query方法,取得一个Cursor游标,它的实参如下
- 要查询的表名称
- 需返回的列名称的一个String数组
- 一个SQL WHERE子句,或者是返回全部行的null
- 实参的String数组会替换WHERE子句里的实参值中的问号占位符。如果WHERE子句中没有实参,则会使用null代替。
- 一个SQL GROUP BY子句(不包含关键字GROUP BY)或者null(如果不希望分组结果)
- SQL HAVING子句(不包含HAVING),指定结果中要包含来自于GROUP BY子句中的哪些组,如果GROUP BY子句为null,则这里也为null。
- SQL ORDER BY子句(不包含关键字ORDER BY),指定结果顺序,或者为null(不指定顺序)
扩展SQLiteOpenHelper
使用SQLiteOpenHelper帮助应用创建数据库并管理版本的变化情况。它要求有如下的4个实参。
- Context,包含需创建和打开的数据库。
- 数据库名称,如果希望使用内存数据库,则为null
- 所使用的CursorFactory,null表示希望使用默认的SQLite CursorFactory
- 数据库版本号,从1开始。
实例代码如下:
private class DatabaseOpenHelper extends SQLiteOpenHelper{
public DatabaseOpenHelper(Context context, String name, CursorFactory factory, int version){
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db){
String createQuery="CREATE TABLE contacts"+"(_id integer primary key autoincrement,"+"name TEXT, phone TEXT);";
db.execSQL(createQuery);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
}
}
以上是关于ListActivity与Adapter以及SQLite的使用的主要内容,如果未能解决你的问题,请参考以下文章
GridView 与 ListActivity 而不是 ListView
Android零基础入门第39节:ListActivity和自定义列表项
ListFragment vs ListActivity - 使用哪一个?
Worklight、SQL-Adapter、指定为定义者的用户 ('mobilefirst'@'localhost') 不存在