本示例说明:
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
本示例效果图:
列出主要代码:
<?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>
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; } }
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
最后,希望大家不吝赐教,对本文不足之处进行批评指正.
相关推荐
本示例将详细介绍如何综合运用ListView,结合数据库操作以及处理ListItem的单击和长按事件。首先,我们来了解一下ListView的基本概念。 ListView是一种可以滚动的视图,它可以显示一列或多列项目。这些项目通常是从...
本示例"listview综合使用示例_结合数据库和listitem单击长按等事件"将深入讲解如何结合SQLite数据库操作与ListView的交互功能,包括单击事件、长按事件的处理。以下是对这些知识点的详细阐述: 1. **ListView**:...
响应用户操作长按事件,示例中展示长按时根据主键Id来编辑和删除数据.5.表现层与数据处理层分开,不依赖于cursor(使用cursor不易表现和业务分离),支持接口编程.6.使用数据库处理框架AHibernate灵活操作sqlite数据库,...
本示例着重讲解如何在ListView中实现长按和单击事件的捕捉。 首先,我们要创建一个自定义的Adapter,这个Adapter是ListView与数据源之间的桥梁,负责将数据转化为ListView可显示的View。在适配器中,我们需要重写`...
综上所述,要避免在ListView中单击和长按事件同时执行,我们需要合理地设计事件监听器和处理逻辑,通过控制事件的顺序和状态来防止冲突。同时,利用Android提供的API或第三方库,我们可以进一步优化用户体验,使得...
综上所述,实现Android ListView的长按删除功能,主要涉及以下几个步骤:设置适配器、添加长按监听器、处理长按事件、删除数据源中的项并更新适配器,以及可选地提供删除确认提示。通过这些步骤,你可以为你的...
在Android开发中,将数据库中的数据展示在ListView上是一项常见的任务。这通常涉及到与后端服务器的交互,数据的获取,以及数据适配器的使用。以下是对这一过程的详细阐述: 首先,我们需要建立Android应用与后台...
在Android开发中,ListView是一个非常重要的组件,它用于展示大量数据列表,通常用于实现像通讯录、消息列表等效果。本教程将详细讲解如何在实际项目中使用ListView,并结合源码分析其工作原理。 首先,我们需要...
6. **长按事件**:除了单击事件,ListView还可以处理长按事件。通过设置`setOnItemLongClickListener()`,可以监听到用户对列表项的长按操作。 7. **自定义动画**:为了提升用户体验,你还可以在点击事件中加入过渡...
本示例将深入探讨如何在Android应用中使用ListView,包括它的基本使用、适配器(Adapter)机制以及一些高级特性。 1. **ListView的基本使用** - 在XML布局文件中,使用`<ListView>`标签创建ListView。例如: ```...
记住,ListView还可以与其他组件(如SwipeRefreshLayout、Header和Footer)结合使用,以实现更复杂的功能。 在ListViewThings压缩包中,可能包含了上述提到的所有文件,包括activity_main.xml、list_item.xml、...
这里我们使用 SQLite 数据库,使用 Database 类来操作数据库,例如,创建数据库、插入数据、查询数据等。 知识点5:ListView 控件的点击事件 ListView 控件可以响应点击事件,例如,点击某一项时,我们可以弹出一...
本示例"android Listview仿QQ长按Item弹出popwindows菜单"旨在教你如何实现类似QQ应用中的长按列表项后弹出快捷操作菜单的功能。这个功能在很多应用中都很常见,可以为用户提供方便的操作入口。 首先,我们需要理解...
综上所述,创建一个多选ListView涉及设置ChoiceMode、维护选中状态、处理用户点击事件、提供视觉反馈以及在状态改变时保存和恢复。通过这个示例,开发者可以了解如何在Android应用中实现一个功能完整的多选ListView...
本示例项目"安卓listview相关相关-AndroidListView实现长按Item弹出CheckBox和操作界面进行批量删除功能模仿某播放器"旨在教授如何在ListView中实现长按选择功能,通过弹出CheckBox和操作界面来实现类似音乐播放器的...
`ListView长按显示菜单` 是一个常见的交互设计,允许用户通过长按列表项(ListView中的每一行)来触发一个上下文相关的操作菜单,提供了对单个条目进行编辑、删除或其他定制操作的方式。在本篇文章中,我们将深入...
本篇文章将深入探讨如何在Android中实现ListView的显示以及单击事件处理。首先,我们了解ListView的基本概念。 ListView是一个可滚动的视图,它能显示一个长列表,其中每个项目都由一个单独的View表示。ListView...
标签 "android listview arraylist" 表明,这个示例程序与 Android 平台、ListView 组件和 ArrayList 类相关。 代码解释 在这个示例程序中,我们首先需要在 Activity 中定义一个 ListView 对象,用于显示数据。然后...
详细介绍文章在http://hi.baidu.com/dean_wang/blog/item/00b0e247d223b528cefca374.html上面。介绍了Android中的ListView的长按事件如何根据点击的项不一样弹出不同的菜单。这是整个工程源码。