说明:多加一点完善

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

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

3.删除加确认提示

4.加删除全部按钮

BlackNumber.java

package com.example.chenshuai.test321;

/**
* Created by chenshuai on 2016/4/16.
*/
//实体类 只负责装载数据
public class BlackNumber { private long id;
private String name;
private String phonenumber; //生成get和set方法
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public long getId() {
return id;
} public void setId(long id) {
this.id = id;
} public String getPhonenumber() {
return phonenumber;
} public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
} //生成构造方法
public BlackNumber() {
} public BlackNumber(String name, String phonenumber) {
this.name = name;
this.phonenumber = phonenumber;
} public BlackNumber(long id,String name,String phonenumber) { this.id = id;
this.name = name;
this.phonenumber = phonenumber;
} //生成tostring方法
@Override
public String toString() {
return "BlackNumber{" +
"id=" + id +
", name='" + name + '\'' +
", phonenumber='" + phonenumber + '\'' +
'}';
}
}

BlackNumberDAO.java

package com.example.chenshuai.test321;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log; import java.util.ArrayList;
import java.util.List; /**
* Created by chenshuai on 2016/4/16.
*/
//数据库操作类
public class BlackNumberDAO { private DBHelper dbHelper; //构造方法 初始化 操作工具类DBHelper 连接数据库
public BlackNumberDAO(Context context)
{
dbHelper = new DBHelper(context);
} //增
public void insert(BlackNumber blackNumber)
{
//连接数据库
SQLiteDatabase sd = dbHelper.getWritableDatabase(); //添加数据
ContentValues cv = new ContentValues(); //要添加数据的键值对集合
cv.put("name",blackNumber.getName());
cv.put("phone_number",blackNumber.getPhonenumber()); //数据添加
sd.insert("black_number",null,cv); //关闭数据库
sd.close(); Log.e("TAG", "添加数据成功");
} //查询
//用List<实体类的实例>返回数据
public List<BlackNumber> getAll()
{
//连接数据库
SQLiteDatabase sd = dbHelper.getWritableDatabase();
//List 接口 ArrayList 实现类
List<BlackNumber> bln = new ArrayList<BlackNumber>();
//查询数据
//连接数据库
//SQLiteDatabase sd = dbHelper.getWritableDatabase(); //返回游标
Cursor cursor = sd.query("black_number", null, null, null, null, null, "_id desc"); //遍历 移动游标,获取数据
while (cursor.moveToNext())
{
//构造实体类的实例,放入List
bln.add(new BlackNumber(cursor.getLong(0),cursor.getString(1),cursor.getString(2))); }
Log.e("TAG", "数据的记录条数" + cursor.getCount());
sd.close();
return bln;
} //改
public void update(BlackNumber blackNumber)
{
//连接数据库
SQLiteDatabase sd = dbHelper.getWritableDatabase();
//要添加数据的键值对集合
ContentValues cv = new ContentValues();
cv.put("name",blackNumber.getName());
cv.put("phone_number",blackNumber.getPhonenumber()); sd.update("black_number",cv,"_id=?",new String[]{String.valueOf(blackNumber.getId())}); sd.close(); Log.e("TAG", "修改数据成功");
} //删
public void delete(long id)
{
//连接数据库
SQLiteDatabase sd = dbHelper.getWritableDatabase();
//删除数据
sd.delete("black_number", "_id=?", new String[]{String.valueOf(id)}); sd.close(); Log.e("TAG", "删除数据成功");
} //全部删除
public void deleteAll()
{
//连接数据库
SQLiteDatabase sd = dbHelper.getWritableDatabase();
//删除全部数据
sd.delete("black_number",null,null);
sd.close();
Log.e("TAG", "删除数据成功"); }
}
activity_activity_black_number.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
tools:context="com.example.chenshuai.test321.Activity_blackNumber"
android:orientation="vertical"> <ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@android:id/list">
</ListView>
<TextView
android:id="@android:id/empty"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="还没有一个黑名单"
android:textSize="30sp"
android:gravity="center"/> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加"
android:textSize="20sp"
android:onClick="tianjiaonclick"/> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="全部删除"
android:textSize="20sp"
android:onClick="quanbusconclick"/> </LinearLayout>
layout_duihuakuang.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="vertical"> <TextView
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="添加黑名单"
android:textSize="30dp"
android:gravity="center_vertical"
android:paddingLeft="20dp"
android:id="@+id/tv_bt_1"/>
<EditText
android:layout_width="match_parent"
android:layout_height="60dp"
android:hint="输入姓名"
android:textSize="20dp"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:id="@+id/et_bt_1"
android:inputType="text"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="60dp"
android:hint="输入黑名单号"
android:textSize="20dp"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:id="@+id/et_bt_2"
android:inputType="number"
/> </LinearLayout>
layout_blacknumber_xianshi.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="vertical"> <TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="显示姓名"
android:textSize="25sp"
android:id="@+id/tv_bt_2"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:layout_marginTop="10dp"
android:background="#ADADAD"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="显示电话"
android:textSize="20sp"
android:id="@+id/tv_bt_3"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:background="#e0e0e0"
/> </LinearLayout>
 Activity_blackNumber.java
package com.example.chenshuai.test321;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; import java.util.List; public class Activity_blackNumber extends ListActivity { private List<BlackNumber> data;
private listviewAdapter lad;
private int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_activity_black_number); ListView lv_1 = getListView(); //构建数据
BlackNumberDAO bln = new BlackNumberDAO(Activity_blackNumber.this); data = bln.getAll(); //适配器
lad = new listviewAdapter();
lv_1.setAdapter(lad); //设置上下文菜单
lv_1.setOnCreateContextMenuListener(this); } //创建上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
//添加两个item
menu.add(0,1,1,"修改");
menu.add(0, 2, 2, "删除"); //获取长按的适配器信息(删除要用)
AdapterView.AdapterContextMenuInfo menuInfo1 = (AdapterView.AdapterContextMenuInfo)menuInfo;
position = menuInfo1.position; super.onCreateContextMenu(menu, v, menuInfo);
} //给选项加点击事件
@Override
public boolean onContextItemSelected(MenuItem item) { final BlackNumber bt = data.get(position); switch (item.getItemId())
{
//修改
case 1:
LayoutInflater inflater = getLayoutInflater();
final View v = inflater.inflate(R.layout.layout_duihuakuang, null); final EditText et_1 = (EditText)v.findViewById(R.id.et_bt_1);
final EditText et_2 = (EditText)v.findViewById(R.id.et_bt_2); //获取默认值
et_1.setText(bt.getName());
et_2.setText(bt.getPhonenumber()); new AlertDialog.Builder(this)
.setView(v)
.setNegativeButton("取消",null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { //获取修改后的值
bt.setName(et_1.getText().toString());
bt.setPhonenumber(et_2.getText().toString()); //执行修改数据库操作
BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activity_blackNumber.this); blackNumberDAO.update(bt); //更新集合
//BlackNumber bt = data.get(position)
//bt和data里面的对象同时指向的是同一个内存地址
//如果bt被修改了,data里面的对象也同时发生变化
//这就是引用类型的特点 //通知刷新列表
lad.notifyDataSetChanged();
Toast.makeText(Activity_blackNumber.this, "修改成功!", Toast.LENGTH_SHORT).show();
}
})
.setCancelable(false)
.show(); break; //删除
case 2:
new AlertDialog.Builder(this)
.setMessage("确定要删除吗?")
.setNegativeButton("取消",null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { //在数据库删除 需要id
BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activity_blackNumber.this); blackNumberDAO.delete(bt.getId()); //刷新界面
//移除集合中的记录
data.remove(position); //通知刷新
lad.notifyDataSetChanged(); Toast.makeText(Activity_blackNumber.this, "删除成功", Toast.LENGTH_SHORT).show();
}
})
.setCancelable(false)
.show();
break;
}
return super.onContextItemSelected(item); } //抽象类 要继承并实现抽象方法后才能使用 实现适配器
class listviewAdapter extends BaseAdapter
{
@Override
public int getCount() {
return data.size();
} @Override
public Object getItem(int position) {
return data.get(position);
} @Override
public long getItemId(int position) {
return data.get(position).getId();
} @Override
public View getView(int position, View convertView, ViewGroup parent) { //判断可复用的视图是否为空
if (convertView == null)
{
//获取视图
//1.获取layout文件 用加载器
LayoutInflater layoutInflater = getLayoutInflater();
convertView = layoutInflater.inflate(R.layout.layout_blacknumber_xianshi,null); }
//给视图绑定数据
TextView tv_1 = (TextView) convertView.findViewById(R.id.tv_bt_2);
TextView tv_2 = (TextView) convertView.findViewById(R.id.tv_bt_3); tv_1.setText(data.get(position).getName());
tv_2.setText(data.get(position).getPhonenumber());
return convertView; } } //添加数据按钮
public void tianjiaonclick(View view)
{
//1.获取加载器
LayoutInflater layoutInflater = getLayoutInflater();
//2.用加载器加载文件
final View v = layoutInflater.inflate(R.layout.layout_duihuakuang,null); new AlertDialog.Builder(this)
.setView(v)
.setCancelable(false)
.setNegativeButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { EditText et_1 = (EditText)v.findViewById(R.id.et_bt_1);
EditText et_2 = (EditText)v.findViewById(R.id.et_bt_2); String name = et_1.getText().toString();
String number = et_2.getText().toString(); //1.构造实体类 参数为输入的电话号码
BlackNumber blackNumber = new BlackNumber(name,number); BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activity_blackNumber.this); //2.用数据库操作类 DAO 保存数据
blackNumberDAO.insert(blackNumber); //添加数据到集合
//给add添加索引值从上往下加数据
data.add(0,blackNumber); //通知适配器刷新ListView
lad.notifyDataSetChanged(); }
})
.show();
} //全部删除
public void quanbusconclick(View view)
{
new AlertDialog.Builder(this)
.setMessage("确定要删除吗?")
.setNegativeButton("取消",null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { //在数据库删除
BlackNumberDAO blackNumberDAO = new BlackNumberDAO(Activity_blackNumber.this); blackNumberDAO.deleteAll(); //刷新界面
//移除集合中的记录
while (position < data.size()) {
data.remove(position);
} //通知刷新
lad.notifyDataSetChanged(); Toast.makeText(Activity_blackNumber.this, "删除所有数据成功", Toast.LENGTH_SHORT).show();
}
})
.setCancelable(false)
.show(); }
}
 
 
 
 

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. HighCharts实现多数据折线图分列显示

    HighCharts实现多数据折线图分列显示 BY ZYZ HighCharts是一个很好用的web端绘图插件,用起来很方便,它的官方支持很好.并且有中文API(不全然).画出来的图像也挺美丽的. 近 ...

  2. 双系统(win8.1+ubuntu14.04)删除win下分区导致grub rescue解决方案

    几个grub rescue下的命令的含义: set 设置环境变量 ls 查看设备 insmod 加载模块 root 指定用于启动系统的分区 prefix 设定grub启动路径 操作流程: 1.  先使 ...

  3. Four Node.js Gotchas that Operations Teams Should Know about

    There is no doubt that Node.js is one of the fastest growing platforms today. It can be found at sta ...

  4. linux php7.1 安装redis扩展

    redis扩展下载网址 http://pecl.php.net/package/redis wget http://101.96.10.64/pecl.php.net/get/redis-3.1.3. ...

  5. 参数化查询 '(@ActualShipTime datetime' 需要参数 @AuthorizationNumber,但未提供该参数。

    转自 http://www.cnblogs.com/cxd4321/archive/2012/08/09/2629716.html 在平时的C#项目开发中,当调用某个存储过程或函数的时候,我们可能经常 ...

  6. 对于android浏览器的一些看法

    首先我先声明我不是一个浏览器开发者,只是近段时间看了一些关于浏览器的东西,才有一些看法. 在几年前开发手机的web 页面,都经常因为JS插件不兼容android WebView内核,导致开发浪费大量时 ...

  7. 根据第三方提供的webservice地址获取文件信息

    import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.en ...

  8. C++11 STL算法简介

    STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library)中,是ANS ...

  9. python(47):range和xrange的区别和联系

    range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. 比如: >>> range(5)[0, 1, 2, ...

  10. Python Redis pipeline操作和Redis乐观锁保持数据一致性

    Redis是建立在TCP协议基础上的CS架构,客户端client对redis server采取请求响应的方式交互. redis 乐观锁:也可理解为版本号比较机制,主要是说在读取数据逇时候同时读取其版本 ...