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

openkk 12年前發布 | 12K 次閱讀 Chrome Dev Editor OOoPy

本示例說明:

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:

</div>

  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>  
  40. </ol> </div>

    2.MainActivity.java:

    </div>

    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. }  
    197. </ol> </div>
      3.數據庫處理層:StudentDaoImpl.java:

      </div>

      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. }  
      38. </ol> </div> 本示例源代碼下載地址:  http://download.csdn.net/detail/lk_blog/4278055


       本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
       轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
       本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!