Android中ListView,SQLite,BaseAdapter的结合

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

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

    代码如下:

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

    Android中ListView,SQLite,BaseAdapter的结合_第1张图片

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

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

     代码如下:

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如下:


<?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

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布局文件如下:很简单
 <?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

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ff4100ff"/> 
            <gradient 
                android:startColor="#ff8c00" 
                android:endColor="#FFFFFF" 
                android:angle="270" /> 
            <stroke 
                android:width="2dp" 
                android:color="#dcdcdc" /> 
            <corners 
                android:radius="2dp" /> 
            <padding 
                android:left="10dp" 
                android:top="10dp" 
                android:right="10dp" 
                android:bottom="10dp" />
</shape>

不见不足以信服,好吧,看看效果图就知道了哈:

  

                          

                                                        Android中ListView,SQLite,BaseAdapter的结合_第2张图片
数据库中的数据我是随手写的,前几个重复数据,后边的不一样(大家不要认为总是显示一个记录哦,其实是不同的数据行,嘻嘻)


你可能感兴趣的:(android,ListView,sqlite,layout,database,conflict)