Android中ListView,SQLite,BaseAdapter的结合


   

大家应该都有过一个想法,就是用listview结合自定义的Adapter来写一个结合SQLite数据库的工程~现在就写下了的哈~~~

第一步:编写关于数据库的类和方法 DBHelper.java

    代码如下:

  1. package com.jftt.db;  
  2.   
  3. import android.content.Context;  
  4. import android.database.Cursor;  
  5. import android.database.sqlite.SQLiteDatabase;  
  6. import android.database.sqlite.SQLiteOpenHelper;  
  7. import android.util.Log;  
  8.   
  9. import com.jftt.conmmon.CONST;  
  10.   
  11. public class DBHelper extends SQLiteOpenHelper {  
  12.  private static final String TAG = "DBHelper";  
  13.   
  14.  public DBHelper(Context context) {  
  15.   super(context, CONST.JFTT_DATABASE_NAME, null,  
  16.     CONST.JFTT_DATABASE_VERSION);  
  17.   
  18.   // TODO Auto-generated constructor stub  
  19.  }  
  20.   
  21.  @Override  
  22.  public void onCreate(SQLiteDatabase db) {  
  23.   
  24.   String createTableSql = "create table "  
  25.     + CONST.JFTT_DATABASE_TABLE_USER  
  26.     + "(_id autoinc primary key , u_name varchar(20),u_pass varchar(20))";  
  27.   db.execSQL(createTableSql);  
  28.   Log.d(TAG, "Table  " + CONST.JFTT_DATABASE_TABLE_USER  
  29.     + " createad succesfully");  
  30.   createTableSql = "CREATE TABLE " + CONST.JFTT_DATABASE_TABLE_INFO + "("  
  31.     + "_id AUTOINC PRIMARY KEY,"  
  32.     + "u_age VARCHAR(20)NOT NULL ON CONFLICT FAIL,"  
  33.     + "u_addr VARCHAR(20)NOT NULL ON CONFLICT FAIL,"  
  34.     + "u_email VARCHAR(20)NOT NULL ON CONFLICT FAIL )";  
  35.   db.execSQL(createTableSql);  
  36.   Log.d(TAG, "Database " + CONST.JFTT_DATABASE_NAME  
  37.     + " createad succesfully");  
  38.  }  
  39.   
  40.  @Override  
  41.  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  42.   // TODO Auto-generated method stub  
  43.   String dropTableSQL = "DROP TABLE IF EXISTS "  
  44.     + CONST.JFTT_DATABASE_TABLE_INFO + " ";  
  45.   db.execSQL(dropTableSQL);  
  46.   dropTableSQL = "DROP TABLE IF EXISTS " + CONST.JFTT_DATABASE_TABLE_USER  
  47.     + " ";  
  48.   db.execSQL(dropTableSQL);  
  49.   onCreate(db);  
  50.  }  
  51.   
  52.  // execute insert,update,delete and so on..  
  53.  public void execSQL(String sql, Object[] args) {  
  54.   SQLiteDatabase db = this.getWritableDatabase();  
  55.   db.execSQL(sql, args);  
  56.   Log.d(TAG, "Execute SQL " + sql + "  succesfully");  
  57.  }  
  58.   
  59.  public Cursor query(String sql, String[] args) {  
  60.   
  61.   SQLiteDatabase db = this.getWritableDatabase();  
  62.   Log.d(TAG, "Query SQL " + sql + "  being excuted....");  
  63.   Cursor cursor = db.rawQuery(sql, args);  
  64.   return cursor;  
  65.  }  
  66. }  
package com.jftt.db;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.jftt.conmmon.CONST;

public class DBHelper extends SQLiteOpenHelper {
 private static final String TAG = "DBHelper";

 public DBHelper(Context context) {
  super(context, CONST.JFTT_DATABASE_NAME, null,
    CONST.JFTT_DATABASE_VERSION);

  // TODO Auto-generated constructor stub
 }

 @Override
 public void onCreate(SQLiteDatabase db) {

  String createTableSql = "create table "
    + CONST.JFTT_DATABASE_TABLE_USER
    + "(_id autoinc primary key , u_name varchar(20),u_pass varchar(20))";
  db.execSQL(createTableSql);
  Log.d(TAG, "Table  " + CONST.JFTT_DATABASE_TABLE_USER
    + " createad succesfully");
  createTableSql = "CREATE TABLE " + CONST.JFTT_DATABASE_TABLE_INFO + "("
    + "_id AUTOINC PRIMARY KEY,"
    + "u_age VARCHAR(20)NOT NULL ON CONFLICT FAIL,"
    + "u_addr VARCHAR(20)NOT NULL ON CONFLICT FAIL,"
    + "u_email VARCHAR(20)NOT NULL ON CONFLICT FAIL )";
  db.execSQL(createTableSql);
  Log.d(TAG, "Database " + CONST.JFTT_DATABASE_NAME
    + " createad succesfully");
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // TODO Auto-generated method stub
  String dropTableSQL = "DROP TABLE IF EXISTS "
    + CONST.JFTT_DATABASE_TABLE_INFO + " ";
  db.execSQL(dropTableSQL);
  dropTableSQL = "DROP TABLE IF EXISTS " + CONST.JFTT_DATABASE_TABLE_USER
    + " ";
  db.execSQL(dropTableSQL);
  onCreate(db);
 }

 // execute insert,update,delete and so on..
 public void execSQL(String sql, Object[] args) {
  SQLiteDatabase db = this.getWritableDatabase();
  db.execSQL(sql, args);
  Log.d(TAG, "Execute SQL " + sql + "  succesfully");
 }

 public Cursor query(String sql, String[] args) {

  SQLiteDatabase db = this.getWritableDatabase();
  Log.d(TAG, "Query SQL " + sql + "  being excuted....");
  Cursor cursor = db.rawQuery(sql, args);
  return cursor;
 }
}

表中结构其实很简单:

   我们建了两个表:

     jftt_user表

      
    jftt_info

    

   由于程序是练习使用,我们没有用到表 jftt_user(呵呵,其实不见这个表也可以的哈)

2:创建应用程序的Adapter(CursorAdapter.java)

     代码如下:

  1. package com.jftt.adpater;  
  2.   
  3. import com.jftt.sqlite.R;  
  4.   
  5. import android.content.Context;  
  6. import android.database.Cursor;  
  7. import android.util.Log;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.ImageView;  
  13. import android.widget.LinearLayout;  
  14. import android.widget.TextView;  
  15.   
  16. public class CursorAdapter extends BaseAdapter {  
  17.   
  18.  private static final String TAG = "CursorAdapter";  
  19.   
  20.  private Context context;  
  21.   
  22.  private Cursor cursor;  
  23.   
  24.  private LayoutInflater inflater;  
  25.   
  26.  private LinearLayout pageLayout;  
  27.   
  28.  public CursorAdapter(Context context, Cursor cursor) {  
  29.   super();  
  30.   this.context = context;  
  31.   this.cursor = cursor;  
  32.   inflater = LayoutInflater.from(context);  
  33.  }  
  34.   
  35.  @Override  
  36.  public int getCount() {  
  37.   Log.d(TAG, "Count :" + cursor.getCount());  
  38.   // TODO Auto-generated method stub  
  39.   return cursor.getCount();  
  40.  }  
  41.   
  42.  @Override  
  43.  public Object getItem(int position) {  
  44.   Log.d(TAG, "Item :" + position);  
  45.   // TODO Auto-generated method stub  
  46.   return position;  
  47.  }  
  48.   
  49.  @Override  
  50.  public long getItemId(int position) {  
  51.   // TODO Auto-generated method stub  
  52.   Log.d(TAG, "ItemId :" + position);  
  53.   return position;  
  54.  }  
  55.   
  56.  @Override  
  57.  public View getView(int position, View convertView, ViewGroup parent) {  
  58.   
  59.   cursor.moveToPosition(position);  
  60.   // TODO Auto-generated method stub  
  61.   pageLayout = (LinearLayout) inflater.inflate(R.layout.page, null);  
  62.   TextView textAddr = (TextView) pageLayout.findViewById(R.id.TextView01);  
  63.   TextView textEmail = (TextView) pageLayout  
  64.     .findViewById(R.id.TextView02);  
  65.   
  66.   textAddr.setText(cursor.getString(2));  
  67.   Log.d(TAG, "Addr :" + cursor.getString(2));  
  68.   textEmail.setText(cursor.getString(3));  
  69.   ImageView image = (ImageView) pageLayout.findViewById(R.id.ImageView01);  
  70.   image.setImageDrawable(context.getResources().getDrawable(  
  71.     R.drawable.icon0));  
  72.   
  73.   return pageLayout;  
  74.   
  75.  }  
  76.   
  77. }  
package com.jftt.adpater;

import com.jftt.sqlite.R;

import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class CursorAdapter extends BaseAdapter {

 private static final String TAG = "CursorAdapter";

 private Context context;

 private Cursor cursor;

 private LayoutInflater inflater;

 private LinearLayout pageLayout;

 public CursorAdapter(Context context, Cursor cursor) {
  super();
  this.context = context;
  this.cursor = cursor;
  inflater = LayoutInflater.from(context);
 }

 @Override
 public int getCount() {
  Log.d(TAG, "Count :" + cursor.getCount());
  // TODO Auto-generated method stub
  return cursor.getCount();
 }

 @Override
 public Object getItem(int position) {
  Log.d(TAG, "Item :" + position);
  // TODO Auto-generated method stub
  return position;
 }

 @Override
 public long getItemId(int position) {
  // TODO Auto-generated method stub
  Log.d(TAG, "ItemId :" + position);
  return position;
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {

  cursor.moveToPosition(position);
  // TODO Auto-generated method stub
  pageLayout = (LinearLayout) inflater.inflate(R.layout.page, null);
  TextView textAddr = (TextView) pageLayout.findViewById(R.id.TextView01);
  TextView textEmail = (TextView) pageLayout
    .findViewById(R.id.TextView02);

  textAddr.setText(cursor.getString(2));
  Log.d(TAG, "Addr :" + cursor.getString(2));
  textEmail.setText(cursor.getString(3));
  ImageView image = (ImageView) pageLayout.findViewById(R.id.ImageView01);
  image.setImageDrawable(context.getResources().getDrawable(
    R.drawable.icon0));

  return pageLayout;

 }

}

程序简单,用心的同学不介意没有注释就懂得哈。我们在程序中加载一个布局文件,用于listview中的每一行信息,布局文件page.xml如下:


  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.  android:layout_width="wrap_content" android:layout_height="wrap_content">  
  4.  <RelativeLayout android:layout_width="fill_parent"  
  5.   android:layout_height="wrap_content">  
  6.   
  7.   <ImageView android:id="@+id/ImageView01"  
  8.       android:paddingTop="10px"  
  9.    android:layout_marginRight="10px" android:layout_width="50dip"  
  10.    android:layout_height="50dip"></ImageView>  
  11.   <LinearLayout android:id="@+id/layout_linear"  
  12.    android:orientation="vertical" android:layout_toRightOf="@id/ImageView01"  
  13.    android:layout_width="300px" android:layout_height="wrap_content">  
  14.    <TextView android:text="@+id/TextView01" android:id="@+id/TextView01"  
  15.     android:layout_below="@id/ImageView01" android:layout_width="wrap_content"  
  16.     android:layout_marginTop="5px" android:layout_marginBottom="10px"  
  17.     android:textColor="@color/blue" android:layout_height="wrap_content">  
  18.   
  19.    </TextView>  
  20.    <TextView android:text="@+id/TextView02" android:id="@+id/TextView02"  
  21.     android:layout_marginTop="10px" android:textColor="@color/blue"  
  22.     android:layout_below="@id/TextView01" android:layout_width="wrap_content"  
  23.     android:layout_height="wrap_content"></TextView>  
  24.   </LinearLayout>  
  25.  </RelativeLayout>  
  26. </LinearLayout>  
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="wrap_content" android:layout_height="wrap_content">
 <RelativeLayout android:layout_width="fill_parent"
  android:layout_height="wrap_content">

  <ImageView android:id="@+id/ImageView01"
      android:paddingTop="10px"
   android:layout_marginRight="10px" android:layout_width="50dip"
   android:layout_height="50dip"></ImageView>
  <LinearLayout android:id="@+id/layout_linear"
   android:orientation="vertical" android:layout_toRightOf="@id/ImageView01"
   android:layout_width="300px" android:layout_height="wrap_content">
   <TextView android:text="@+id/TextView01" android:id="@+id/TextView01"
    android:layout_below="@id/ImageView01" android:layout_width="wrap_content"
    android:layout_marginTop="5px" android:layout_marginBottom="10px"
    android:textColor="@color/blue" android:layout_height="wrap_content">

   </TextView>
   <TextView android:text="@+id/TextView02" android:id="@+id/TextView02"
    android:layout_marginTop="10px" android:textColor="@color/blue"
    android:layout_below="@id/TextView01" android:layout_width="wrap_content"
    android:layout_height="wrap_content"></TextView>
  </LinearLayout>
 </RelativeLayout>
</LinearLayout>

注意----    cursor.moveToPosition(position);当我们要改变ListView中每一行的数据时候,游标是不断改变的,就是移动到要显示的View的position处,这一点我搞了好久,原以为只是顺序的移动带下一个行就行了。但是实践证明我们必须这样写。

3:编写程序入口(主Activity)

代码如下:SQLiteActivity.java

  1. package com.jftt.sqlite;  
  2.   
  3. import com.jftt.adpater.CursorAdapter;  
  4. import com.jftt.conmmon.CONST;  
  5. import com.jftt.db.DBHelper;  
  6.   
  7. import android.app.Activity;  
  8. import android.database.Cursor;  
  9. import android.os.Bundle;  
  10. import android.util.Log;  
  11. import android.widget.ListView;  
  12. import android.widget.SimpleCursorAdapter;  
  13.   
  14. public class SQLiteActivity extends Activity {  
  15.  private static final String TAG = "SQLiteActivity";  
  16.  private ListView listView;  
  17.   
  18.  /** Called when the activity is first created. */  
  19.  @Override  
  20.  public void onCreate(Bundle savedInstanceState) {  
  21.   Log.d(TAG, "App started");  
  22.   super.onCreate(savedInstanceState);  
  23.   setContentView(R.layout.main);  
  24.   init();  
  25.   DBHelper dbHelper = new DBHelper(this);  
  26.   Cursor cursor = dbHelper.query("select * from "  
  27.     + CONST.JFTT_DATABASE_TABLE_INFO, null);  
  28.   
  29.   listView.setAdapter(new CursorAdapter(this, cursor));  
  30.  }  
  31.   
  32.  private void init() {  
  33.   Log.d(TAG, "Initialing UI Component");  
  34.   this.listView = (ListView) this.findViewById(R.id.ListView01);  
  35.  }  
  36. }  
package com.jftt.sqlite;

import com.jftt.adpater.CursorAdapter;
import com.jftt.conmmon.CONST;
import com.jftt.db.DBHelper;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class SQLiteActivity extends Activity {
 private static final String TAG = "SQLiteActivity";
 private ListView listView;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  Log.d(TAG, "App started");
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  init();
  DBHelper dbHelper = new DBHelper(this);
  Cursor cursor = dbHelper.query("select * from "
    + CONST.JFTT_DATABASE_TABLE_INFO, null);

  listView.setAdapter(new CursorAdapter(this, cursor));
 }

 private void init() {
  Log.d(TAG, "Initialing UI Component");
  this.listView = (ListView) this.findViewById(R.id.ListView01);
 }
}

大家可以看到,主程序需要一个ListView,我们这里写在了xml布局中,当然可以用主程序extends ListActivity。这点我就不多说了。
XML布局文件如下:很简单
  1.  <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout android:id="@+id/LinearLayout01"  
  3.     android:background="@drawable/background"  
  4.  android:layout_width="fill_parent" android:layout_height="fill_parent"  
  5.  xmlns:android="http://schemas.android.com/apk/res/android">  
  6.     
  7.  <ListView android:layout_width="wrap_content"  
  8.      android:dividerHeight="0.5dip"  
  9.      android:scrollX="10px"  
  10.      android:divider="#4169E1"  
  11.   android:layout_height="wrap_content" android:id="@+id/ListView01" />  
  12.     
  13. </LinearLayout>   
 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/LinearLayout01"
    android:background="@drawable/background"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 xmlns:android="http://schemas.android.com/apk/res/android">
  
 <ListView android:layout_width="wrap_content"
     android:dividerHeight="0.5dip"
     android:scrollX="10px"
     android:divider="#4169E1"
  android:layout_height="wrap_content" android:id="@+id/ListView01" />
  
</LinearLayout> 

程序中还会用到一些华而不是的技巧,其中需要以下文件,写在drawable下面:

 

background.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <solid android:color="#ff4100ff"/>   
  4.             <gradient   
  5.                 android:startColor="#ff8c00"   
  6.                 android:endColor="#FFFFFF"   
  7.                 android:angle="270" />   
  8.             <stroke   
  9.                 android:width="2dp"   
  10.                 android:color="#dcdcdc" />   
  11.             <corners   
  12.                 android:radius="2dp" />   
  13.             <padding   
  14.                 android:left="10dp"   
  15.                 android:top="10dp"   
  16.                 android:right="10dp"   
  17.                 android:bottom="10dp" />  
  18. </shape>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值