本示例说明:

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

 

本示例效果图:

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

文章转载于 http://blog.csdn.net/lk_blog/article/details/7537200

android listview综合使用示例_结合数据库操作和listitem单击长按等事件处理的更多相关文章

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

    本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用 ...

  2. Android学习笔记(十六)——数据库操作(上)

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, ...

  3. Android ListView 嵌套 ImageView,如何响应ImageView的点击和长按事件

    http://www.tuicool.com/articles/EZv2Uv 1.先说下嵌套在ListView中的ImageView如何响应点击事件 方法:在imageView中设置onClick属性 ...

  4. android ListView优化

    android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...

  5. IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架

    每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...

  6. Android ListView工作原理完全解析,带你从源码的角度彻底理解

    版权声明:本文出自郭霖的博客,转载必须注明出处.   目录(?)[+] Adapter的作用 RecycleBin机制 第一次Layout 第二次Layout 滑动加载更多数据   转载请注明出处:h ...

  7. Android -- listview的使用, Inflater打气筒创建View对象,三种数据Adapter

    1. 代码示例,( 数据库来源上篇的数据) MainActivity.java public class MainActivity extends Activity { private ListVie ...

  8. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

  9. android中的数据库操作

    如何在android中调用数据库资源 在android中主要有两种方法来实现对数据库的访问,一种是adb shell方式,另一种是通过相关的android 的java类来间接的对数据库来进行操作.其中 ...

随机推荐

  1. ORA-00205

    场景 数据库启动时报错.关闭前还是正常运行的,再次启动时,就报了以下错误. Copyright (c) , , Oracle. All rights reserved. Connected to an ...

  2. PC-1500与PC通讯

    目录 第1章说明    2 第2章音频通讯    3 2.1 下载    3 2.2 上传    8 2.2.1 操作    8 2.2.2 音量    8 2.3 直接将BASIC代码转换为wav文 ...

  3. HTML5游戏实战(4): 20行代码实现FlappyBird

    这个系列很久没有更新了.几个月前有位读者调侃说,能不能一行代码做一个游戏呢.呵呵,接下来一段时间,我天天都在想这个问题,怎么能让GameBuilder+CanTK进一步简化游戏的开发呢.经过几个月的努 ...

  4. IE6 IE7 hasLayout bug之li间的3px垂直间距

    1. li中仅包含a,span等内联(行内)元素2.触发条件: li元素的layout被触发(通常为设置了宽或高,设置overflow:hidden在IE7下同样触发layout),且a或span元素 ...

  5. jmeter笔记3

     1. 使用JMeter做性能测试(Windows) 1.1. 启动JMeter 下载JMeter的安装包,点击安装包\jakarta-jmeter-2.3RC4\bin下的jmeter.bat文件即 ...

  6. WANL标准组织介绍-02

    无线电管理委员会 FCC ETSI IEEE Wi-Fi IETF WAPI 国家无线电管理委员会认证 国家无线电管理委员会认证(State Radio Regulatory Commission o ...

  7. Qt之QThread(深入理解)

    简述 为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程.对于耗时操作如果不使用线程,UI界面将会长时间处于停滞状态,这种情况是用户非常不愿意看到的,我们可以用线程来解决这个问题. 前面,已 ...

  8. Qt之QSS(QDarkStyleSheet)

    简述 关于样式,前面介绍了很多内容,下面分享一个深色样式表,很值得借鉴! 简述 效果 QSS 更多参考 效果 QSS /* * The MIT License (MIT) * * Copyright ...

  9. BT5更新源

    感谢http://blog.csdn.net/seaos/article/details/7064136终于找到更新成功的源了 下面简单介绍步骤吧 gedit /etc/apt/sources.lis ...

  10. hdu5883 The Best Path(欧拉路)

    题目链接:hdu5883 The Best Path 比赛第一遍做的时候没有考虑回路要枚举起点的情况导致WA了一发orz 节点 i 的贡献为((du[i] / 2) % 2)* a[i] 欧拉回路的起 ...