本示例說明:
1.自定義listview條目樣式,自定義listview顯示列數的多少,靈活與數據庫中字段綁定.
2.實現對DB的增刪改查,並且操作後listview自動刷新.
3.響應用戶操作點擊事件,示例中展示單擊時取出主鍵Id和其他內容.
4.響應用戶操作長按事件,示例中展示長按時根據主鍵Id來編輯和刪除數據.
5.表現層與數據處理層分開,不依賴於cursor(使用cursor不易表現和業務分離),支持接口編程.
6.使用數據庫處理框架AHibernate靈活操作sqlite數據庫,詳見: http://blog.csdn.net/lk_blog/article/details/7455992
本示例效果圖:
列出主要代碼:
1.list.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/child"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#E3D25E"
- android:orientation="horizontal" >
- <!-- 若想隱藏id加入此屬性: android:visibility="gone",這樣做有點類似於Html中hidden域 -->
- <TextView
- android:id="@+id/idTo"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#ff0000" />
- <TextView
- android:id="@+id/nameTo"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingBottom="5px"
- android:paddingLeft="50px"
- android:paddingTop="5px"
- android:text="No data"
- android:textColor="#0000ff"
- android:textSize="20sp" />
- <TextView
- android:id="@+id/ageTo"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingBottom="5px"
- android:paddingLeft="50px"
- android:paddingTop="5px"
- android:text="No data"
- android:textColor="#00ff00"
- android:textSize="20sp" />
- </LinearLayout>
2.MainActivity.java:
- package com.tgb.lk.listview;
- import java.util.List;
- import java.util.Map;
- import com.tgb.lk.demo.dao.StudentDao;
- import com.tgb.lk.demo.dao.impl.StudentDaoImpl;
- import com.tgb.lk.demo.model.Student;
- import com.tgb.lk.listview.R;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.text.TextUtils;
- import android.view.ContextMenu;
- import android.view.MenuItem;
- import android.view.View;
- import android.view.ContextMenu.ContextMenuInfo;
- import android.view.View.OnClickListener;
- import android.widget.AdapterView;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- import android.widget.TextView;
- import android.widget.Toast;
- import android.widget.AdapterView.AdapterContextMenuInfo;
- import android.widget.AdapterView.OnItemClickListener;
- /**
- * 歡迎訪問我的博客進行對代碼交流: http://blog.csdn.net/lk_blog
- * 數據庫處理使用AHibernate框架,詳見:http://blog.csdn.net/lk_blog/article/details/7455992
- * @author likun
- */
- public class MainActivity extends Activity {
- private static final int ITEM_MODIFY = 1;
- private static final int ITEM_DELETE = 2;
- // 定義接口
- private StudentDao dao = null;
- private ListView lv = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- // 添加
- Button btnAdd = (Button) findViewById(R.id.btnAdd);
- btnAdd.setOnClickListener(listener);
- // 顯示前3條數據
- Button btnShow = (Button) findViewById(R.id.btnShow);
- btnShow.setOnClickListener(listener);
- // 刪除數據
- Button btnClear = (Button) findViewById(R.id.btnClear);
- btnClear.setOnClickListener(listener);
- lv = (ListView) findViewById(R.id.lvStudent);
- // 設置在條目上單擊監聽器
- lv.setOnItemClickListener(itemListener);
- // 設置長按事件
- registerForContextMenu(lv);
- // 顯示所有數據
- showData(-1);
- }
- // 顯示數據,num小於等於0時顯示所有數據,num大於0時顯示前N條.
- private void showData(int num) {
- dao = (dao == null ? new StudentDaoImpl(this) : dao);
- List<Map<String, String>> data = null;
- if (num <= 0) { // 顯示所有學生,調用dao層接口
- data = dao.queryAllStudent();
- } else {// 顯示前N個學生,調用dao層接口
- data = dao.queryTopN(num);
- }
- SimpleAdapter adapter = buildListAdapter(this, data);
- lv.setAdapter(adapter);
- }
- // 構建adapter.
- public SimpleAdapter buildListAdapter(Context context,
- List<Map<String, String>> data) {
- SimpleAdapter adapter = new SimpleAdapter(context, data, R.layout.list,
- new String[] { "_id", "name", "age" }, new int[] { R.id.idTo,
- R.id.nameTo, R.id.ageTo });
- return adapter;
- }
- // 初始化數據
- OnClickListener listener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- dao = (dao == null ? new StudentDaoImpl(MainActivity.this) : dao);
- switch (v.getId()) {
- case R.id.btnAdd:
- // 添加學生
- Student student1 = new Student();
- student1.setName("lk");
- student1.setAge(26);
- dao.insert(student1);
- Student student2 = new Student();
- student2.setName("cls");
- student2.setAge(26);
- dao.insert(student2);
- Student student3 = new Student();
- student3.setName("lb");
- student3.setAge(27);
- dao.insert(student3);
- showData(-1);
- break;
- case R.id.btnShow:
- // 顯示前3條數據
- showData(3);
- break;
- case R.id.btnClear:
- // 刪除所有數據
- dao.deleteData();
- // 顯示所有數據
- showData(-1);
- break;
- default:
- break;
- }
- }
- };
- // 條目上單擊處理方法.
- OnItemClickListener itemListener = new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position,
- long id) {
- // 這裏的view是我們在list.xml中定義的LinearLayout對象.
- // 所以可以通過findViewById方法可以找到list.xml中定義的它的子對象,如下:
- TextView stuId = (TextView) view.findViewById(R.id.idTo);
- TextView stuName = (TextView) view.findViewById(R.id.nameTo);
- TextView stuAge = (TextView) view.findViewById(R.id.ageTo);
- toastShow("學號:" + stuId.getText().toString() + "; 姓名:"
- + stuName.getText().toString() + "; 年齡:"
- + stuAge.getText().toString());
- }
- };
- // 封裝Toast,一方面調用簡單,另一方面調整顯示時間只要改此一個地方即可.
- public void toastShow(String text) {
- Toast.makeText(MainActivity.this, text, 1000).show();
- }
- // 長按時顯示的菜單
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- menu.setHeaderTitle("請選擇操作");
- menu.add(0, ITEM_MODIFY, 0, "編輯");
- menu.add(0, ITEM_DELETE, 1, "刪除");
- }
- // 響應編輯和刪除事件處理
- public boolean onContextItemSelected(MenuItem item) {
- AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
- .getMenuInfo();
- // info.targetView得到list.xml中的LinearLayout對象.
- String stuId = ((TextView) info.targetView.findViewById(R.id.idTo))
- .getText().toString();
- if (!TextUtils.isEmpty(stuId)) {
- int id = Integer.parseInt(stuId);
- dao = (dao == null ? new StudentDaoImpl(this) : dao);
- switch (item.getItemId()) {
- case ITEM_MODIFY:
- // 編輯數據
- toastShow("編輯" + stuId);
- // 此方法定義在AHibernate中.更多使用示例見http://blog.csdn.net/lk_blog/article/details/7455992
- Student student = dao.get(id);
- student.setName("李坤");
- student.setAge(26);
- dao.update(student); // 此方法定義在AHibernate中.
- break;
- case ITEM_DELETE:
- // 刪除數據
- toastShow("刪除" + stuId);
- dao.delete(id);// 此方法定義在AHibernate中.
- break;
- default:
- break;
- }
- }
- showData(-1);
- return false;
- }
- }
3.數據庫處理層:StudentDaoImpl.java:
- package com.tgb.lk.demo.dao.impl;
- import java.util.List;
- import java.util.Map;
- import com.tgb.lk.ahibernate.dao.impl.BaseDaoImpl;
- import com.tgb.lk.demo.dao.StudentDao;
- import com.tgb.lk.demo.model.Student;
- import com.tgb.lk.demo.util.DBHelper;
- import android.content.Context;
- //本文數據庫處理引用jar包AHibernate處理.
- //AHibernate的詳細使用教程示例地址: http://blog.csdn.net/lk_blog/article/details/7455992
- //AHibernate源碼交流地址: http://blog.csdn.net/lk_blog/article/details/7456125
- //AHibernate jar包下載及源代碼下載地址: http://download.csdn.net/detail/lk_blog/4222048
- public class StudentDaoImpl extends BaseDaoImpl<Student> implements StudentDao {
- public StudentDaoImpl(Context context) {
- super(new DBHelper(context));
- }
- // 返回一個List,List中的對象是以sql中的列的小寫形式爲key的Map.(本例中 _id,name,age爲key)
- public List<Map<String, String>> queryAllStudent() {
- String sql = "select _id, name,age from t_student";
- return super.query2MapList(sql, null);
- }
- // 返回一個List,List中的對象是以sql中的列的小寫形式爲key的Map.(本例中 _id,name,age爲key)
- public List<Map<String, String>> queryTopN(int num) {
- String sql = "select _id, name,age from t_student limit ?";
- return super.query2MapList(sql, new String[] { String.valueOf(num) });
- }
- public void deleteData() {
- String sql = "delete from t_student";
- super.execSql(sql, null);
- }
- }
本示例源代碼下載地址: http://download.csdn.net/detail/lk_blog/4278055
最後,希望大家不吝賜教,對本文不足之處進行批評指正.