android listview綜合使用示例_結合數據庫操作和listitem單擊長按等事件處理

http://blog.csdn.net/lk_blog/article/details/7537200

本示例說明:

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:

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/child"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:background="#E3D25E"  
  7.     android:orientation="horizontal" >  
  8.   
  9.     <!-- 若想隱藏id加入此屬性: android:visibility="gone",這樣做有點類似於Html中hidden域 -->  
  10.   
  11.     <TextView  
  12.         android:id="@+id/idTo"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:textColor="#ff0000" />  
  16.   
  17.     <TextView  
  18.         android:id="@+id/nameTo"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:paddingBottom="5px"  
  22.         android:paddingLeft="50px"  
  23.         android:paddingTop="5px"  
  24.         android:text="No data"  
  25.         android:textColor="#0000ff"  
  26.         android:textSize="20sp" />  
  27.   
  28.     <TextView  
  29.         android:id="@+id/ageTo"  
  30.         android:layout_width="wrap_content"  
  31.         android:layout_height="wrap_content"  
  32.         android:paddingBottom="5px"  
  33.         android:paddingLeft="50px"  
  34.         android:paddingTop="5px"  
  35.         android:text="No data"  
  36.         android:textColor="#00ff00"  
  37.         android:textSize="20sp" />  
  38.   
  39. </LinearLayout>  

2.MainActivity.java:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tgb.lk.listview;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import com.tgb.lk.demo.dao.StudentDao;  
  7. import com.tgb.lk.demo.dao.impl.StudentDaoImpl;  
  8. import com.tgb.lk.demo.model.Student;  
  9.   
  10. import com.tgb.lk.listview.R;  
  11. import android.app.Activity;  
  12. import android.content.Context;  
  13. import android.os.Bundle;  
  14. import android.text.TextUtils;  
  15. import android.view.ContextMenu;  
  16. import android.view.MenuItem;  
  17. import android.view.View;  
  18. import android.view.ContextMenu.ContextMenuInfo;  
  19. import android.view.View.OnClickListener;  
  20. import android.widget.AdapterView;  
  21. import android.widget.Button;  
  22. import android.widget.ListView;  
  23. import android.widget.SimpleAdapter;  
  24. import android.widget.TextView;  
  25. import android.widget.Toast;  
  26. import android.widget.AdapterView.AdapterContextMenuInfo;  
  27. import android.widget.AdapterView.OnItemClickListener;  
  28. /** 
  29.  * 歡迎訪問我的博客進行對代碼交流: http://blog.csdn.net/lk_blog 
  30.  * 數據庫處理使用AHibernate框架,詳見:http://blog.csdn.net/lk_blog/article/details/7455992 
  31.  * @author likun 
  32.  */  
  33. public class MainActivity extends Activity {  
  34.     private static final int ITEM_MODIFY = 1;  
  35.     private static final int ITEM_DELETE = 2;  
  36.   
  37.     // 定義接口  
  38.     private StudentDao dao = null;  
  39.     private ListView lv = null;  
  40.   
  41.     @Override  
  42.     public void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.main);  
  45.   
  46.         // 添加  
  47.         Button btnAdd = (Button) findViewById(R.id.btnAdd);  
  48.         btnAdd.setOnClickListener(listener);  
  49.         // 顯示前3條數據  
  50.         Button btnShow = (Button) findViewById(R.id.btnShow);  
  51.         btnShow.setOnClickListener(listener);  
  52.         // 刪除數據  
  53.         Button btnClear = (Button) findViewById(R.id.btnClear);  
  54.         btnClear.setOnClickListener(listener);  
  55.   
  56.         lv = (ListView) findViewById(R.id.lvStudent);  
  57.         // 設置在條目上單擊監聽器  
  58.         lv.setOnItemClickListener(itemListener);  
  59.         // 設置長按事件  
  60.         registerForContextMenu(lv);  
  61.   
  62.         // 顯示所有數據  
  63.         showData(-1);  
  64.     }  
  65.   
  66.     // 顯示數據,num小於等於0時顯示所有數據,num大於0時顯示前N條.  
  67.     private void showData(int num) {  
  68.         dao = (dao == null ? new StudentDaoImpl(this) : dao);  
  69.         List<Map<String, String>> data = null;  
  70.         if (num <= 0) { // 顯示所有學生,調用dao層接口  
  71.             data = dao.queryAllStudent();  
  72.         } else {// 顯示前N個學生,調用dao層接口  
  73.             data = dao.queryTopN(num);  
  74.         }  
  75.         SimpleAdapter adapter = buildListAdapter(this, data);  
  76.         lv.setAdapter(adapter);  
  77.   
  78.     }  
  79.   
  80.     // 構建adapter.  
  81.     public SimpleAdapter buildListAdapter(Context context,  
  82.             List<Map<String, String>> data) {  
  83.         SimpleAdapter adapter = new SimpleAdapter(context, data, R.layout.list,  
  84.                 new String[] { "_id""name""age" }, new int[] { R.id.idTo,  
  85.                         R.id.nameTo, R.id.ageTo });  
  86.         return adapter;  
  87.     }  
  88.   
  89.     // 初始化數據  
  90.     OnClickListener listener = new OnClickListener() {  
  91.         @Override  
  92.         public void onClick(View v) {  
  93.             dao = (dao == null ? new StudentDaoImpl(MainActivity.this) : dao);  
  94.             switch (v.getId()) {  
  95.             case R.id.btnAdd:  
  96.                 // 添加學生  
  97.                 Student student1 = new Student();  
  98.                 student1.setName("lk");  
  99.                 student1.setAge(26);  
  100.                 dao.insert(student1);  
  101.   
  102.                 Student student2 = new Student();  
  103.                 student2.setName("cls");  
  104.                 student2.setAge(26);  
  105.                 dao.insert(student2);  
  106.   
  107.                 Student student3 = new Student();  
  108.                 student3.setName("lb");  
  109.                 student3.setAge(27);  
  110.                 dao.insert(student3);  
  111.                 showData(-1);  
  112.   
  113.                 break;  
  114.             case R.id.btnShow:  
  115.                 // 顯示前3條數據  
  116.                 showData(3);  
  117.                 break;  
  118.             case R.id.btnClear:  
  119.                 // 刪除所有數據  
  120.                 dao.deleteData();  
  121.   
  122.                 // 顯示所有數據  
  123.                 showData(-1);  
  124.                 break;  
  125.             default:  
  126.                 break;  
  127.             }  
  128.   
  129.         }  
  130.     };  
  131.   
  132.     // 條目上單擊處理方法.  
  133.     OnItemClickListener itemListener = new OnItemClickListener() {  
  134.         @Override  
  135.         public void onItemClick(AdapterView<?> parent, View view, int position,  
  136.                 long id) {  
  137.             // 這裏的view是我們在list.xml中定義的LinearLayout對象.  
  138.             // 所以可以通過findViewById方法可以找到list.xml中定義的它的子對象,如下:  
  139.             TextView stuId = (TextView) view.findViewById(R.id.idTo);  
  140.             TextView stuName = (TextView) view.findViewById(R.id.nameTo);  
  141.             TextView stuAge = (TextView) view.findViewById(R.id.ageTo);  
  142.   
  143.             toastShow("學號:" + stuId.getText().toString() + "; 姓名:"  
  144.                     + stuName.getText().toString() + "; 年齡:"  
  145.                     + stuAge.getText().toString());  
  146.         }  
  147.     };  
  148.   
  149.     // 封裝Toast,一方面調用簡單,另一方面調整顯示時間只要改此一個地方即可.  
  150.     public void toastShow(String text) {  
  151.         Toast.makeText(MainActivity.this, text, 1000).show();  
  152.     }  
  153.   
  154.     // 長按時顯示的菜單  
  155.     @Override  
  156.     public void onCreateContextMenu(ContextMenu menu, View v,  
  157.             ContextMenuInfo menuInfo) {  
  158.         menu.setHeaderTitle("請選擇操作");  
  159.         menu.add(0, ITEM_MODIFY, 0"編輯");  
  160.         menu.add(0, ITEM_DELETE, 1"刪除");  
  161.     }  
  162.   
  163.     // 響應編輯和刪除事件處理  
  164.     public boolean onContextItemSelected(MenuItem item) {  
  165.         AdapterContextMenuInfo info = (AdapterContextMenuInfo) item  
  166.                 .getMenuInfo();  
  167.         // info.targetView得到list.xml中的LinearLayout對象.  
  168.         String stuId = ((TextView) info.targetView.findViewById(R.id.idTo))  
  169.                 .getText().toString();  
  170.         if (!TextUtils.isEmpty(stuId)) {  
  171.             int id = Integer.parseInt(stuId);  
  172.             dao = (dao == null ? new StudentDaoImpl(this) : dao);  
  173.             switch (item.getItemId()) {  
  174.             case ITEM_MODIFY:  
  175.                 // 編輯數據  
  176.                 toastShow("編輯" + stuId);  
  177.                 // 此方法定義在AHibernate中.更多使用示例見http://blog.csdn.net/lk_blog/article/details/7455992  
  178.                 Student student = dao.get(id);  
  179.                 student.setName("李坤");  
  180.                 student.setAge(26);  
  181.                 dao.update(student); // 此方法定義在AHibernate中.  
  182.                 break;  
  183.             case ITEM_DELETE:  
  184.                 // 刪除數據  
  185.                 toastShow("刪除" + stuId);  
  186.                 dao.delete(id);// 此方法定義在AHibernate中.  
  187.                 break;  
  188.             default:  
  189.                 break;  
  190.             }  
  191.         }  
  192.         showData(-1);  
  193.         return false;  
  194.     }  
  195.   
  196. }  


3.數據庫處理層:StudentDaoImpl.java:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.tgb.lk.demo.dao.impl;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import com.tgb.lk.ahibernate.dao.impl.BaseDaoImpl;  
  7. import com.tgb.lk.demo.dao.StudentDao;  
  8. import com.tgb.lk.demo.model.Student;  
  9. import com.tgb.lk.demo.util.DBHelper;  
  10. import android.content.Context;  
  11.   
  12. //本文數據庫處理引用jar包AHibernate處理.  
  13. //AHibernate的詳細使用教程示例地址: http://blog.csdn.net/lk_blog/article/details/7455992  
  14. //AHibernate源碼交流地址: http://blog.csdn.net/lk_blog/article/details/7456125  
  15. //AHibernate jar包下載及源代碼下載地址: http://download.csdn.net/detail/lk_blog/4222048  
  16. public class StudentDaoImpl extends BaseDaoImpl<Student> implements StudentDao {  
  17.     public StudentDaoImpl(Context context) {  
  18.         super(new DBHelper(context));  
  19.     }  
  20.   
  21.     // 返回一個List,List中的對象是以sql中的列的小寫形式爲key的Map.(本例中 _id,name,age爲key)  
  22.     public List<Map<String, String>> queryAllStudent() {  
  23.         String sql = "select _id, name,age from t_student";  
  24.         return super.query2MapList(sql, null);  
  25.     }  
  26.   
  27.     // 返回一個List,List中的對象是以sql中的列的小寫形式爲key的Map.(本例中 _id,name,age爲key)  
  28.     public List<Map<String, String>> queryTopN(int num) {  
  29.         String sql = "select _id, name,age from t_student limit ?";  
  30.         return super.query2MapList(sql, new String[] { String.valueOf(num) });  
  31.     }  
  32.   
  33.     public void deleteData() {  
  34.         String sql = "delete from t_student";  
  35.         super.execSql(sql, null);  
  36.     }  
  37. }  

本示例源代碼下載地址: http://download.csdn.net/detail/lk_blog/4278055

最後,希望大家不吝賜教,對本文不足之處進行批評指正.


發佈了72 篇原創文章 · 獲贊 13 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章