上篇博客攻克了Androidclient通过WebService与server端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序怎样与本机文件型数据库SQLite进行交互,还有一问题则是怎样在ListView中依照我们想要的界面效果进行展示。限于篇幅这篇重点讲ListView,下篇博客重点阐述SQLite。

ListView是一个经常使用的数据显示控件,如果我们要做一个简单的界面,如图所看到的。

这张图是我直接从Android平板电脑(Android 4.2.2)上面截图下来的,就是一个普通的列表。能够点击报名button获取到相应行的信息。

这里面显示的数据是我从SQLite数据库中查询出来的,封装的类的代码例如以下:

public class MyDatabaseHelper extends SQLiteOpenHelper {private static final String name = "mydb.db";// SQLite数据库文件名称private static final int version = 1;// SQLite数据库版本public MyDatabaseHelper(Context context) {super(context, name, null, version);}@SuppressLint("SimpleDateFormat")@Overridepublic void onCreate(SQLiteDatabase db) {try {// 开启事务db.beginTransaction();String sql = "create table jobInfo (name varchar(20),"+ "num integer," + "date varchar(10),"+ "description text)";db.execSQL(sql);//測试插入10条数据for (int i = 0; i < 10; i++) {db.execSQL("insert into jobInfo(name,num,date,description)values(?,?,?

,?)", new Object[] { "name" + i, i, new SimpleDateFormat("yyyy-MM-dd") .format(new Date()), "description" + i }); } // 标识事务成功 db.setTransactionSuccessful(); } finally { // 结束事务 db.endTransaction(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //数据库升级操作 } }

在须要创建数据库、插入数据的地方都能够实例化MyDatabaseHelper这个类。关于很多其它的SQLite的细节下篇博客将会进行具体的说明。

activity_main.xml布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin" ><LinearLayoutandroid:id="@+id/head"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="岗位名称"android:textSize="24sp"android:width="150dip" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="岗位数量"android:textSize="24sp"android:width="150dip" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="公布日期"android:textSize="24sp"android:width="150dip" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="岗位描写叙述"android:textSize="24sp"android:width="550dip" /></LinearLayout><ListViewandroid:id="@id/android:list"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/head" ></ListView></RelativeLayout>

能够看到这是一个相对布局,里面有一个线性布局。线性布局里面又放置了4个TextView作为ListView数据的标题。以下直接是一个ListView控件,因为这是相对布局,为了让ListView显示在“表头”以下。我们设置了layout_below属性。

此外要注意ListView的id的写法。

接着依照界面的要求,我们准备一下ListView载入布局文件的内容。我们起名为:list_item.xml。

list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal" ><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="24sp"android:width="150dip" /><TextViewandroid:id="@+id/num"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="24sp"android:width="150dip" /><TextViewandroid:id="@+id/date"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="24sp"android:width="150dip" /><TextViewandroid:id="@+id/description"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="24sp"android:width="550dip" /><Buttonandroid:id="@+id/btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:focusable="false"android:focusableInTouchMode="false"android:text="报名"android:width="150dip"android:textSize="24sp" /></LinearLayout>

这也是一个普通的线性布局,设置orientation为horizontal(水平)。

布局文件准备好。以下我们准备写代码了。

我们让MainActivity这个类继承自ListActivity。完整的代码例如以下:

public class MainActivity extends ListActivity {List<Map<String, Object>> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);list = new ArrayList<Map<String, Object>>();//初始化SQLite数据库操作类对象MyDatabaseHelper dbHelper = new MyDatabaseHelper(MainActivity.this);//查询数据库返回Cursor(游标)对象Cursor cursor = dbHelper.getReadableDatabase().query("jobInfo",new String[] { "name", "num", "date", "description" }, null,null, null, null, "name");//将结果集封装到List<Map<String,Object>>数据结构其中while (cursor.moveToNext()) {Map<String, Object> map = new HashMap<String, Object>();map.put("name", cursor.getString(0));map.put("num", cursor.getInt(1));map.put("date", cursor.getString(2));map.put("description", cursor.getString(3));map.put("btn", R.drawable.ic_launcher);list.add(map);}//查询完成,记得及时关闭数据库链接cursor.close();MyButtonAdapter adapter = new MyButtonAdapter(MainActivity.this, list,R.layout.list_item, new String[] { "name", "num", "date","description", "btn" }, new int[] { R.id.name,R.id.num, R.id.date, R.id.description, R.id.btn });//给ListView设置数据填充适配器ListView listView = (ListView) findViewById(android.R.id.list);listView.setAdapter(adapter);}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {//ListView的@SuppressWarnings("unchecked")Map<String, Object> map = (HashMap<String, Object>) l.getItemAtPosition(position);Toast.makeText(MainActivity.this,"您点击了:" + map.get("name").toString() + "岗位!

", Toast.LENGTH_SHORT).show(); } public class MyButtonAdapter extends BaseAdapter { private class ButtonViewHolder { TextView name; TextView num; TextView date; TextView description; Button btn; } private Context mContext; private List<Map<String, Object>> mList; private ButtonViewHolder holder; private LayoutInflater mInflater; private String[] keyString; private int[] valueViewID; // 构造函数初始化变量 public MyButtonAdapter(Context context, List<Map<String, Object>> list, int resource, String[] from, int[] to) { this.mContext = context; this.mList = list; // 获得布局文件对象 mInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); keyString = new String[from.length]; valueViewID = new int[to.length]; // 复制数组 System.arraycopy(from, 0, keyString, 0, from.length); System.arraycopy(to, 0, valueViewID, 0, to.length); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } /** * 从list中移除某一项 * * @param position */ public void removeItem(int position) { list.remove(position); // 通知数据集已改变,请求自刷新 this.notifyDataSetChanged(); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView != null) { holder = (ButtonViewHolder) convertView.getTag(); } else { convertView = mInflater.inflate(R.layout.list_item, null); holder = new ButtonViewHolder(); holder.name = (TextView) convertView .findViewById(valueViewID[0]);// 岗位名称 holder.num = (TextView) convertView .findViewById(valueViewID[1]);// 岗位数量 holder.date = (TextView) convertView .findViewById(valueViewID[2]);// 公布日期 holder.description = (TextView) convertView .findViewById(valueViewID[3]);// 岗位描写叙述 holder.btn = (Button) convertView.findViewById(valueViewID[4]);// 报名button convertView.setTag(holder); } Map<String, Object> appInfo = mList.get(position); if (appInfo != null) { String aname = (String) appInfo.get(keyString[0]); Integer anum = (Integer) appInfo.get(keyString[1]); String adate = (String) appInfo.get(keyString[2]); String adescription = (String) appInfo.get(keyString[3]); holder.name.setText(aname); holder.num.setText(anum + ""); holder.date.setText(adate); holder.description.setText(adescription); // 报名button事件 holder.btn.setOnClickListener(new lvButtonListener(position)); } return convertView; } class lvButtonListener implements OnClickListener { private int position; lvButtonListener(int pos) { position = pos; } @Override public void onClick(View v) { int vid = v.getId(); if (vid == holder.btn.getId()) { String result = "" + "岗位名称:" + list.get(position).get("name") + "\r\n" + "岗位人数:" + list.get(position).get("num") + "\r\n" + "公布日期:" + list.get(position).get("date") + "\r\n" + "岗位描写叙述:" + list.get(position).get("description") + "\r\n"; new AlertDialog.Builder(MainActivity.this) .setTitle("提示") .setIcon(R.drawable.ic_launcher) .setMessage(result + "\r\n" + "您确定要申请该岗位吗?") .setPositiveButton(R.string.positive, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { Toast toast = Toast .makeText( MainActivity.this, "您点击了" + getResources() .getString( R.string.positive) + "button,申请了" + list.get( position) .get("name") + "的岗位!

", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } }) .setNegativeButton(R.string.negative, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { Toast toast = Toast .makeText( MainActivity.this, "您点击了" + getResources() .getString( R.string.negative) + "button", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } }).create().show(); // 如果要删除行。能够调用此方法 // removeItem(position); } } } } }

上面的代码有几个知识点须要注意:

1、SQLite数据库的查询操作

我们通过getReadableDatabase().query方法运行了查询操作。返回Cursor(游标。与JDBC中的ResultSet相似)对象。

2、ListView控件使用(重点)

我们參考了SimpleAdapter默认的构造函数的方法,创建了自己定义的MyButtonAdapter类,在显示数据的同一时候,能够给每一行的button绑定点击事件。

3、弹出提示框

弹出提示框的代码非常长,全然能够封装到一个方法中,简化代码。这里完整的列出来。目的就是体验一下设计思路。

经过观察我们发现,这就是所谓的“链式编程”。能够通过连续的".",设置參数(控制显示效果)。

strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="positive">确定</string><string name="negative">取消</string>
</resources>

终于在pad上面的运行效果例如以下:

Android开发系列之ListView相关推荐

  1. android listview下拉动画效果,Android开发中利用ListView实现一个渐变式的下拉刷新动画...

    Android开发中利用ListView实现一个渐变式的下拉刷新动画 发布时间:2020-11-23 16:50:31 来源:亿速云 阅读:80 作者:Leah 本篇文章给大家分享的是有关Androi ...

  2. Android开发系列7——icon图标和开机启动页

    前言   Android开发App过程中,需要一个独特吸引眼球的应用icon,以及标新的Launch页面用于简明的介绍.为了适配各种 手机的尺寸和手机屏幕分辩率,需要同一张图片制作多种尺寸用于兼容各种 ...

  3. 最新网易微专业 Android开发系列

    目录 ├─1.Android应用界面开发 │  ├─001 Android开发简介.flv │  ├─002 开始第一个应用.flv │  ├─003 Activity你必须知道的那些事(上).flv ...

  4. android开发--详解ListView,动态添加,删除Adapter中的数据项

    ListView是Android开发中最常用到的控件之一,所以学习ListView显得非常重要,在本文中,作者继承了BaseAdapter实现了自己的Adapter,在其中实现相应的方法,包括添加,删 ...

  5. 【Android开发】自定义ListView,使用通用适配器,并实现ListView上的每一项和每一项上的按钮等控件同时监听

    ListView在Android开发中是比较常用的系统组件,但是有时候我们除了需要做ListView上每一行的点击监听事件之外,如果每一行上还有其他需要监听的控件例如Button.CheckBox等, ...

  6. Android开发系列全套课程(视频教程50G)

    本系列课程面向有java基础,想进入企业从事android开发的计算机专业者.学习搭配实战案例,高效掌握岗位知识. 原来地址失效 链接已更新(2021年5月1号更新): https://pan.bai ...

  7. Android开发系列(三)

    这是更加android开发文档,写的我的第一个Android开发项目,就是在屏幕上显示一个简单的Hello World.       首先介绍几个概念:       AVD,AVD的全称为:Andro ...

  8. 零基础学Android开发系列

    目标:沉浸了这么久,准备写点文章,在写文章的同时,巩固Android开发的基础知识,每天一个Android小案例,从零带领大家开发简单的Android应用.

  9. Android开发系列(十二) QQ联系人列表升级版——ListView和ScrollView高阶使用方法...

    今天继续进行QQ界面的开发工作.前一段时间讲过ExpandableListView的使用并且设置了一个比较简单的具有子菜单效果的联系人列表,本节添加进ScrollView控件,对QQ2013版的联系人 ...

最新文章

  1. java笔记 -- java运算
  2. 惠普发布软件定义存储 助力提升虚拟化能力
  3. java logfaction_Java调试的变迁:从System.out.println到log4j
  4. 我的技术博客在博客园落户了
  5. Journey to Un‘Goro 贪心,找规律,搜索(沈阳)
  6. jmeter --- 基于InfluxDBGrafana的JMeter实时性能测试数据的监控和展示
  7. C++ 控制结构和函数(一) —— 控制结构
  8. FarPoint Spread For .Net 4.0
  9. Android事件分发小结
  10. adb shell常用命令收录
  11. LOJ#3085. 「GXOI / GZOI2019」特技飞行(KDtree+坐标系变换)
  12. NonEmpty和Hierarchize嵌套的bug
  13. Centos 7.0 的svn
  14. linux退出热键_LINUX常用快捷键
  15. STM32计数器/定时器之PWM脉宽捕获+超声波传感器测距
  16. C语言博客作业--一二维数组
  17. Temporal Anti-Aliasing(时域抗锯齿TAA)
  18. 小甲鱼C++快速入门——第四天
  19. String转换成json
  20. vuecli4关于Warning in ./src/plugins/element.js “export ‘default’ (imported as ‘Vue’) was not found in

热门文章

  1. [HDOJ2845]Beans(dp)
  2. Ubuntu上安装nginx步骤及问题记录
  3. 30个创意出色的非常实用的jquery框架插件-(视觉大背景,瀑布流效果)
  4. JVM启动的时候,默认加入的属性
  5. java支持泛型_Java自学-泛型 支持泛型的类
  6. 怎么将算法改成程序_多肉烂根怎么办?将土培改成水培,长势好,叶子变得更水灵...
  7. CSS层叠上下文、层叠顺序和层叠等级
  8. 【错误记录】VMware 虚拟机报错 ( 无法连接网络 | VMWare 中打开已经连接好的虚拟机 | 选择 “ 在图形功能不兼容情况下, 车行是恢复虚拟机 “ 选项 )
  9. 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )
  10. 【计算理论】Pumping 引理 ( 四个等价概念 | 自动机界限 | Pumping 引理简介 | Pumping 引理证明正则表达式 | Pumping 引理示例分析 )