说明:多加一点完善

1.在操作类 DAO 将连接数据库也放到了构造方法中(错误),加删除全部的方法

2.主界面增加了姓名一栏,用layout文件将对话框分离出来

3.删除加确认提示

4.加删除全部按钮

BlackNumber.java

  1. package com.example.chenshuai.test321;
  2.  
  3. /**
  4. * Created by chenshuai on 2016/4/16.
  5. */
  6. //实体类 只负责装载数据
  7. public class BlackNumber {
  8.  
  9. private long id;
  10. private String name;
  11. private String phonenumber;
  12.  
  13. //生成get和set方法
  14. public String getName() {
  15. return name;
  16. }
  17.  
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. public long getId() {
  23. return id;
  24. }
  25.  
  26. public void setId(long id) {
  27. this.id = id;
  28. }
  29.  
  30. public String getPhonenumber() {
  31. return phonenumber;
  32. }
  33.  
  34. public void setPhonenumber(String phonenumber) {
  35. this.phonenumber = phonenumber;
  36. }
  37.  
  38. //生成构造方法
  39. public BlackNumber() {
  40. }
  41.  
  42. public BlackNumber(String name, String phonenumber) {
  43. this.name = name;
  44. this.phonenumber = phonenumber;
  45. }
  46.  
  47. public BlackNumber(long id,String name,String phonenumber) {
  48.  
  49. this.id = id;
  50. this.name = name;
  51. this.phonenumber = phonenumber;
  52. }
  53.  
  54. //生成tostring方法
  55. @Override
  56. public String toString() {
  57. return "BlackNumber{" +
  58. "id=" + id +
  59. ", name='" + name + '\'' +
  60. ", phonenumber='" + phonenumber + '\'' +
  61. '}';
  62. }
  63. }

BlackNumberDAO.java

  1. package com.example.chenshuai.test321;
  2.  
  3. import android.content.ContentValues;
  4. import android.content.Context;
  5. import android.database.Cursor;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import android.util.Log;
  8.  
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. /**
  13. * Created by chenshuai on 2016/4/16.
  14. */
  15. //数据库操作类
  16. public class BlackNumberDAO {
  17.  
  18. private DBHelper dbHelper;
  19.  
  20. //构造方法 初始化 操作工具类DBHelper 连接数据库
  21. public BlackNumberDAO(Context context)
  22. {
  23. dbHelper = new DBHelper(context);
  24. }
  25.  
  26. //增
  27. public void insert(BlackNumber blackNumber)
  28. {
  29. //连接数据库
  30. SQLiteDatabase sd = dbHelper.getWritableDatabase();
  31.  
  32. //添加数据
  33. ContentValues cv = new ContentValues();
  34.  
  35. //要添加数据的键值对集合
  36. cv.put("name",blackNumber.getName());
  37. cv.put("phone_number",blackNumber.getPhonenumber());
  38.  
  39. //数据添加
  40. sd.insert("black_number",null,cv);
  41.  
  42. //关闭数据库
  43. sd.close();
  44.  
  45. Log.e("TAG", "添加数据成功");
  46. }
  47.  
  48. //查询
  49. //用List<实体类的实例>返回数据
  50. public List<BlackNumber> getAll()
  51. {
  52. //连接数据库
  53. SQLiteDatabase sd = dbHelper.getWritableDatabase();
  54. //List 接口 ArrayList 实现类
  55. List<BlackNumber> bln = new ArrayList<BlackNumber>();
  56. //查询数据
  57. //连接数据库
  58. //SQLiteDatabase sd = dbHelper.getWritableDatabase();
  59.  
  60. //返回游标
  61. Cursor cursor = sd.query("black_number", null, null, null, null, null, "_id desc");
  62.  
  63. //遍历 移动游标,获取数据
  64. while (cursor.moveToNext())
  65. {
  66. //构造实体类的实例,放入List
  67. bln.add(new BlackNumber(cursor.getLong(0),cursor.getString(1),cursor.getString(2)));
  68.  
  69. }
  70. Log.e("TAG", "数据的记录条数" + cursor.getCount());
  71. sd.close();
  72. return bln;
  73. }
  74.  
  75. //改
  76. public void update(BlackNumber blackNumber)
  77. {
  78. //连接数据库
  79. SQLiteDatabase sd = dbHelper.getWritableDatabase();
  80. //要添加数据的键值对集合
  81. ContentValues cv = new ContentValues();
  82. cv.put("name",blackNumber.getName());
  83. cv.put("phone_number",blackNumber.getPhonenumber());
  84.  
  85. sd.update("black_number",cv,"_id=?",new String[]{String.valueOf(blackNumber.getId())});
  86.  
  87. sd.close();
  88.  
  89. Log.e("TAG", "修改数据成功");
  90. }
  91.  
  92. //删
  93. public void delete(long id)
  94. {
  95. //连接数据库
  96. SQLiteDatabase sd = dbHelper.getWritableDatabase();
  97. //删除数据
  98. sd.delete("black_number", "_id=?", new String[]{String.valueOf(id)});
  99.  
  100. sd.close();
  101.  
  102. Log.e("TAG", "删除数据成功");
  103. }
  104.  
  105. //全部删除
  106. public void deleteAll()
  107. {
  108. //连接数据库
  109. SQLiteDatabase sd = dbHelper.getWritableDatabase();
  110. //删除全部数据
  111. sd.delete("black_number",null,null);
  112. sd.close();
  113. Log.e("TAG", "删除数据成功");
  114.  
  115. }
  116. }
  1. activity_activity_black_number.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin"
  10. tools:context="com.example.chenshuai.test321.Activity_blackNumber"
  11. android:orientation="vertical">
  12.  
  13. <ListView
  14. android:layout_width="match_parent"
  15. android:layout_height="0dp"
  16. android:layout_weight="1"
  17. android:id="@android:id/list">
  18. </ListView>
  19. <TextView
  20. android:id="@android:id/empty"
  21. android:layout_width="match_parent"
  22. android:layout_height="0dp"
  23. android:layout_weight="1"
  24. android:text="还没有一个黑名单"
  25. android:textSize="30sp"
  26. android:gravity="center"/>
  27.  
  28. <Button
  29. android:layout_width="match_parent"
  30. android:layout_height="wrap_content"
  31. android:text="添加"
  32. android:textSize="20sp"
  33. android:onClick="tianjiaonclick"/>
  34.  
  35. <Button
  36. android:layout_width="match_parent"
  37. android:layout_height="wrap_content"
  38. android:text="全部删除"
  39. android:textSize="20sp"
  40. android:onClick="quanbusconclick"/>
  41.  
  42. </LinearLayout>
  1. layout_duihuakuang.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6.  
  7. <TextView
  8. android:layout_width="match_parent"
  9. android:layout_height="60dp"
  10. android:text="添加黑名单"
  11. android:textSize="30dp"
  12. android:gravity="center_vertical"
  13. android:paddingLeft="20dp"
  14. android:id="@+id/tv_bt_1"/>
  15. <EditText
  16. android:layout_width="match_parent"
  17. android:layout_height="60dp"
  18. android:hint="输入姓名"
  19. android:textSize="20dp"
  20. android:gravity="center_vertical"
  21. android:paddingLeft="10dp"
  22. android:id="@+id/et_bt_1"
  23. android:inputType="text"
  24. />
  25. <EditText
  26. android:layout_width="match_parent"
  27. android:layout_height="60dp"
  28. android:hint="输入黑名单号"
  29. android:textSize="20dp"
  30. android:gravity="center_vertical"
  31. android:paddingLeft="10dp"
  32. android:id="@+id/et_bt_2"
  33. android:inputType="number"
  34. />
  35.  
  36. </LinearLayout>
  1. layout_blacknumber_xianshi.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6.  
  7. <TextView
  8. android:layout_width="match_parent"
  9. android:layout_height="40dp"
  10. android:text="显示姓名"
  11. android:textSize="25sp"
  12. android:id="@+id/tv_bt_2"
  13. android:gravity="center_vertical"
  14. android:paddingLeft="10dp"
  15. android:layout_marginTop="10dp"
  16. android:background="#ADADAD"
  17. />
  18. <TextView
  19. android:layout_width="match_parent"
  20. android:layout_height="40dp"
  21. android:text="显示电话"
  22. android:textSize="20sp"
  23. android:id="@+id/tv_bt_3"
  24. android:gravity="center_vertical"
  25. android:paddingLeft="10dp"
  26. android:background="#e0e0e0"
  27. />
  28.  
  29. </LinearLayout>
  1. Activity_blackNumber.java
  1. package com.example.chenshuai.test321;
  2.  
  3. import android.app.AlertDialog;
  4. import android.app.ListActivity;
  5. import android.content.DialogInterface;
  6. import android.os.Bundle;
  7. import android.view.ContextMenu;
  8. import android.view.LayoutInflater;
  9. import android.view.MenuItem;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.AdapterView;
  13. import android.widget.BaseAdapter;
  14. import android.widget.EditText;
  15. import android.widget.ListView;
  16. import android.widget.TextView;
  17. import android.widget.Toast;
  18.  
  19. import java.util.List;
  20.  
  21. public class Activity_blackNumber extends ListActivity {
  22.  
  23. private List<BlackNumber> data;
  24. private listviewAdapter lad;
  25. private int position;
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.activity_activity_black_number);
  30.  
  31. ListView lv_1 = getListView();
  32.  
  33. //构建数据
  34. BlackNumberDAO bln = new BlackNumberDAO(Activity_blackNumber.this);
  35.  
  36. data = bln.getAll();
  37.  
  38. //适配器
  39. lad = new listviewAdapter();
  40. lv_1.setAdapter(lad);
  41.  
  42. //设置上下文菜单
  43. lv_1.setOnCreateContextMenuListener(this);
  44.  
  45. }
  46.  
  47. //创建上下文菜单
  48. @Override
  49. public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
  50. //添加两个item
  51. menu.add(0,1,1,"修改");
  52. menu.add(0, 2, 2, "删除");
  53.  
  54. //获取长按的适配器信息(删除要用)
  55. AdapterView.AdapterContextMenuInfo menuInfo1 = (AdapterView.AdapterContextMenuInfo)menuInfo;
  56. position = menuInfo1.position;
  57.  
  58. super.onCreateContextMenu(menu, v, menuInfo);
  59. }
  60.  
  61. //给选项加点击事件
  62. @Override
  63. public boolean onContextItemSelected(MenuItem item) {
  64.  
  65. final BlackNumber bt = data.get(position);
  66.  
  67. switch (item.getItemId())
  68. {
  69. //修改
  70. case 1:
  71. LayoutInflater inflater = getLayoutInflater();
  72. final View v = inflater.inflate(R.layout.layout_duihuakuang, null);
  73.  
  74. final EditText et_1 = (EditText)v.findViewById(R.id.et_bt_1);
  75. final EditText et_2 = (EditText)v.findViewById(R.id.et_bt_2);
  76.  
  77. //获取默认值
  78. et_1.setText(bt.getName());
  79. et_2.setText(bt.getPhonenumber());
  80.  
  81. new AlertDialog.Builder(this)
  82. .setView(v)
  83. .setNegativeButton("取消",null)
  84. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  85. @Override
  86. public void onClick(DialogInterface dialog, int which) {
  87.  
  88. //获取修改后的值
  89. bt.setName(et_1.getText().toString());
  90. bt.setPhonenumber(et_2.getText().toString());
  91.  
  92. //执行修改数据库操作
  93. BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activity_blackNumber.this);
  94.  
  95. blackNumberDAO.update(bt);
  96.  
  97. //更新集合
  98. //BlackNumber bt = data.get(position)
  99. //bt和data里面的对象同时指向的是同一个内存地址
  100. //如果bt被修改了,data里面的对象也同时发生变化
  101. //这就是引用类型的特点
  102.  
  103. //通知刷新列表
  104. lad.notifyDataSetChanged();
  105. Toast.makeText(Activity_blackNumber.this, "修改成功!", Toast.LENGTH_SHORT).show();
  106. }
  107. })
  108. .setCancelable(false)
  109. .show();
  110.  
  111. break;
  112.  
  113. //删除
  114. case 2:
  115. new AlertDialog.Builder(this)
  116. .setMessage("确定要删除吗?")
  117. .setNegativeButton("取消",null)
  118. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  119. @Override
  120. public void onClick(DialogInterface dialog, int which) {
  121.  
  122. //在数据库删除 需要id
  123. BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activity_blackNumber.this);
  124.  
  125. blackNumberDAO.delete(bt.getId());
  126.  
  127. //刷新界面
  128. //移除集合中的记录
  129. data.remove(position);
  130.  
  131. //通知刷新
  132. lad.notifyDataSetChanged();
  133.  
  134. Toast.makeText(Activity_blackNumber.this, "删除成功", Toast.LENGTH_SHORT).show();
  135. }
  136. })
  137. .setCancelable(false)
  138. .show();
  139. break;
  140. }
  141. return super.onContextItemSelected(item);
  142.  
  143. }
  144.  
  145. //抽象类 要继承并实现抽象方法后才能使用 实现适配器
  146. class listviewAdapter extends BaseAdapter
  147. {
  148. @Override
  149. public int getCount() {
  150. return data.size();
  151. }
  152.  
  153. @Override
  154. public Object getItem(int position) {
  155. return data.get(position);
  156. }
  157.  
  158. @Override
  159. public long getItemId(int position) {
  160. return data.get(position).getId();
  161. }
  162.  
  163. @Override
  164. public View getView(int position, View convertView, ViewGroup parent) {
  165.  
  166. //判断可复用的视图是否为空
  167. if (convertView == null)
  168. {
  169. //获取视图
  170. //1.获取layout文件 用加载器
  171. LayoutInflater layoutInflater = getLayoutInflater();
  172. convertView = layoutInflater.inflate(R.layout.layout_blacknumber_xianshi,null);
  173.  
  174. }
  175. //给视图绑定数据
  176. TextView tv_1 = (TextView) convertView.findViewById(R.id.tv_bt_2);
  177. TextView tv_2 = (TextView) convertView.findViewById(R.id.tv_bt_3);
  178.  
  179. tv_1.setText(data.get(position).getName());
  180. tv_2.setText(data.get(position).getPhonenumber());
  181. return convertView;
  182.  
  183. }
  184.  
  185. }
  186.  
  187. //添加数据按钮
  188. public void tianjiaonclick(View view)
  189. {
  190. //1.获取加载器
  191. LayoutInflater layoutInflater = getLayoutInflater();
  192. //2.用加载器加载文件
  193. final View v = layoutInflater.inflate(R.layout.layout_duihuakuang,null);
  194.  
  195. new AlertDialog.Builder(this)
  196. .setView(v)
  197. .setCancelable(false)
  198. .setNegativeButton("取消", null)
  199. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  200. @Override
  201. public void onClick(DialogInterface dialog, int which) {
  202.  
  203. EditText et_1 = (EditText)v.findViewById(R.id.et_bt_1);
  204. EditText et_2 = (EditText)v.findViewById(R.id.et_bt_2);
  205.  
  206. String name = et_1.getText().toString();
  207. String number = et_2.getText().toString();
  208.  
  209. //1.构造实体类 参数为输入的电话号码
  210. BlackNumber blackNumber = new BlackNumber(name,number);
  211.  
  212. BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activity_blackNumber.this);
  213.  
  214. //2.用数据库操作类 DAO 保存数据
  215. blackNumberDAO.insert(blackNumber);
  216.  
  217. //添加数据到集合
  218. //给add添加索引值从上往下加数据
  219. data.add(0,blackNumber);
  220.  
  221. //通知适配器刷新ListView
  222. lad.notifyDataSetChanged();
  223.  
  224. }
  225. })
  226. .show();
  227. }
  228.  
  229. //全部删除
  230. public void quanbusconclick(View view)
  231. {
  232. new AlertDialog.Builder(this)
  233. .setMessage("确定要删除吗?")
  234. .setNegativeButton("取消",null)
  235. .setPositiveButton("确定", new DialogInterface.OnClickListener() {
  236. @Override
  237. public void onClick(DialogInterface dialog, int which) {
  238.  
  239. //在数据库删除
  240. BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activity_blackNumber.this);
  241.  
  242. blackNumberDAO.deleteAll();
  243.  
  244. //刷新界面
  245. //移除集合中的记录
  246. while (position < data.size()) {
  247. data.remove(position);
  248. }
  249.  
  250. //通知刷新
  251. lad.notifyDataSetChanged();
  252.  
  253. Toast.makeText(Activity_blackNumber.this, "删除所有数据成功", Toast.LENGTH_SHORT).show();
  254. }
  255. })
  256. .setCancelable(false)
  257. .show();
  258.  
  259. }
  260. }
  1.  
  1.  
  1.  
  1.  

Android——黑名单管理(二)的更多相关文章

  1. 【转】Android LCD(二):LCD常用接口原理篇

    关键词:android LCD TFT TTL(RGB)  LVDS  EDP MIPI  TTL-LVDS  TTL-EDP 平台信息:内核:linux2.6/linux3.0系统:android/ ...

  2. 【转】android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)

    关键词:android  camera CMM 模组 camera参数  CAMIF平台信息:内核:linux系统:android 平台:S5PV310(samsung exynos 4210) 作者 ...

  3. Android进阶(二十八)上下文菜单ContextMenu使用案例

    上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...

  4. Android进阶(二十)AndroidAPP开发问题汇总(四)

    · Android进阶(二十)AndroidAPP开发问题汇总(四) android:layout_width和android:width的区别 基中的android:layout_width和and ...

  5. Android生成二维码--保存和分享二维码图片

    之前写过生成自定义二维码的两篇文章:<Android生成自定义二维码><Android生成二维码–拍照或从相册选取图片>,下面就介绍一下Android应用内如何保存以及分享二维 ...

  6. Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画

    Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画 0.首先.先给出一张效果gif图. 1.贝塞尔曲线原理及相关公式參考:http://www.jianshu.com/p/c0d7ad79 ...

  7. Android LCD(二):LCD常用接口原理篇(转)

    源: Android LCD(二):LCD常用接口原理篇

  8. Android Studio(二):快捷键设置、插件安装

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  9. Android—ZXing二维码扫描遇到的问题

    最近工作中需要开发带有二维码扫描功能的软件(基于开源项目ZXing),遇到的问题记录一下,也希望给大家带来帮助. 1.首先因为扫描要开摄像机所以加权限是一定的,不然后面什么都不能进行 <uses ...

随机推荐

  1. springcloud中服务组策与发现eureka

    1 Eureka 是什么 Eureka是netflix的一个子模块,只需要使用服务的标志符,就可以访问到服务,而不需要修改服务调用的配置文件.功能类似于Dubbo的注册中心,比如Zookeeper. ...

  2. RocketMQ最佳实践(一)4.0版本/概念介绍/安装调试/客户端demo

    为什么选择RocketMQ 我们来看看官方回答: “我们研究发现,对于ActiveMQ而言,随着越来越多的使用queues和topics,其IO成为了瓶颈.某些情况下,消费者缓慢(消费能力不足)还会拖 ...

  3. 【Android开发】Android Host详解(翻译自官方文档)

    原文:http://android.eoe.cn/topic/summary 文档内容 API概述 Android中manifest文件需求 工作的设备 * 发现设备 * 获得和设备进行“交流”的权限 ...

  4. Android 源码解析:单例模式-通过容器实现单例模式-懒加载方式

    本文分析了 Android 系统服务通过容器实现单例,确保系统服务的全局唯一. 开发过 Android 的用户肯定都用过这句代码,主要作用是把布局文件 XML 加载到系统中,转换为 Android 的 ...

  5. Atitit 大龄软件工程师的出路attilax总结

    Atitit 大龄软件工程师的出路attilax总结 1.1. 创业vs打工 联合创始人 合伙人1 1.2. 项目管理 架构师1 1.3. 软件培训 讲师2 1.4. 研究院研究员2 1.5. 继续博 ...

  6. [svc]为何linux ext4文件系统目录默认大小是4k?

    linux ext4普通盘为什么目录大小是4k? Why does every directory have a size 4096 bytes (4 K)? To understand this, ...

  7. SQLServer中进行sql除法运算结果为小数时显示0的解决方案

    转自:http://blog.sina.com.cn/s/blog_8020e41101019k7t.html SELECT field1/field2 FROM TB; 当 field1的数值 &g ...

  8. 基于ASP.NET MVC的ABP框架入门学习教程

    为什么使用ABP 我们近几年陆续开发了一些Web应用和桌面应用,需求或简单或复杂,实现或优雅或丑陋.一个基本的事实是:我们只是积累了一些经验或提高了对,NET的熟悉程度. 随着软件开发经验的不断增加, ...

  9. vscode 换行符\n 变成\r\n

    VSCode是一个开源的强大代码编写器,但是如果没有好好的配置使用,会适得其反. 这里总结VSCode的一些配置,方便自己查询,也方便网友. 1.编辑器配置 为特定类型文件指定缩进大小.缩进类型(空格 ...

  10. tornado源码分析-多进程

    1.源码文件 process.py 2.fork子进程 def fork_processes(num_processes, max_restarts=100): ... def start_child ...