您的位置:首页 > 移动开发 > Android开发

Android中ListView,SQLite,BaseAdapter的结合

2013-03-11 14:32 169 查看
今天突然有个奇妙的想法,就是用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



由于程序是练习使用,我们没有用到表 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>

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



数据库中的数据我是随手写的,前几个重复数据,后边的不一样(大家不要认为总是显示一个记录哦,其实是不同的数据行,嘻嘻)谁还有方法(更简单直观的),欢迎留言交流,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: