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属性还包括:
下面是示例代码: <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类和ListViewListActivity是只包含一个ListView的类。可以使用CursorAdapter作为适配器填充ListView。并且ListActivity是内置ListView。ListView需要设置adapter和OnItemClickListener。同时要使用SimpleCursorAdapter,必须先定义两个数组,分别包含需要映射成GUI组件的列名称及GUI组件的资源ID。SimpleCursorAdapter的构造函数接收如下参数:
实例代码如下: 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是一个要求三个参数的泛型类型:
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方法的参数
下面是示例代码 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,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",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"},"name"); } public Cursor getOneContact(long id){ return database.query("contacts",null); } public void deleteContact(long id){ open(); database.delete("contacts",null); close(); } } getAllContacts方法使用SQLiteDatabase的query方法,取得一个Cursor游标,它的实参如下
扩展SQLiteOpenHelper使用SQLiteOpenHelper帮助应用创建数据库并管理版本的变化情况。它要求有如下的4个实参。
实例代码如下: private class DatabaSEOpenHelper extends SQLiteOpenHelper{ public DatabaSEOpenHelper(Context context,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){ } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |