android listview综合使用示例_结合数据库操作和listitem单击长按等事件处理

13年前

本示例说明:

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:

  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:

  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:

  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