实现黑名单的添加、修改、查询和删除,首先得有封装的3个类,便于使用

BlackNumber.java

package com.hanqi.test3;

/**
* Created by Administrator on 2016/4/15.
*/
public class BlackNumber {
private long id;
private String phoneNumber; public BlackNumber(long id, String phoneNumber) {
this.id = id;
this.phoneNumber = phoneNumber;
} public BlackNumber() { } 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(String phoneNumber) {
this.phoneNumber = phoneNumber;
} @Override
public String toString() {
return "BlackNumber{" +
"id=" + id +
", phoneNumber='" + phoneNumber + '\'' +
'}';
}
}

DBHelper.java

package com.hanqi.test3;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; /**
* Created by Administrator on 2016/4/15.
*/
public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) {
super(context, "blacklist.db",null, 1);
} @Override
public void onCreate(SQLiteDatabase db) { db.execSQL("create table black_number (_id integer primary key autoincrement,phone_number varchar)"); Log.e("TAG","onCreate"); } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

BlackNumberDAO.java

package com.hanqi.test3;

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 Administrator on 2016/4/15.
*/
public class BlackNumberDAO { //定义成成员变量
private DBHelper dbHelper; public BlackNumberDAO(Context context)
{
//初始化工具类
dbHelper = new DBHelper(context);
} //增
public void insert(BlackNumber blackNumber)
{
//获取数据库连接
SQLiteDatabase sd = dbHelper.getWritableDatabase(); //要添加数据的键值对集合
ContentValues contentValues = new ContentValues(); contentValues.put("phone_number",blackNumber.getPhoneNumber()); //数据添加 contentValues:集合存了键值对
sd.insert("black_number",null,contentValues); //关闭数据库
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 update(BlackNumber blackNumber)
{
//获取数据库连接
SQLiteDatabase sd = dbHelper.getWritableDatabase(); //要添加数据的键值对集合
ContentValues contentValues = new ContentValues(); contentValues.put("phone_number",blackNumber.getPhoneNumber()); //数据修改
sd.update("black_number",contentValues,"_id =?",new String[]{String.valueOf(blackNumber.getId())}); //关闭数据库
sd.close(); Log.e("TAG","添加数据成功");
} //查
//用List(List里面装的是实体类的实例)返回数据
public List<BlackNumber> getAll()
{
List<BlackNumber> rtn = new ArrayList<BlackNumber>();
// ArrayList:实现类 List:接口 //获取数据库连接
SQLiteDatabase sd = dbHelper.getWritableDatabase(); //查询返回游标
Cursor cursor = sd.query("black_number", null, null, null, null, null, "_id desc"); //移动游标,获取数据
while (cursor.moveToNext())
{
//构造实体类的实例,放入List
rtn.add(new BlackNumber(cursor.getLong(0),cursor.getString(1)));
} Log.e("TAG","数据数量"+cursor.getCount()); sd.close();
return rtn;
}
}

下面开始写页面布局

TestActivity.java

package com.hanqi.test3;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.InputType;
import android.view.ContextMenu;
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 TestActivity1 extends ListActivity { private ListView lv_1;
private List<BlackNumber> data;
private BlackListAdapter dla; private int position; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test1); //lv_1 = (ListView)findViewById(R.id.lv_1);
lv_1 = getListView(); //获取数据集合
BlackNumberDAO bd = new BlackNumberDAO(this); data = bd.getAll(); dla = new BlackListAdapter(); //设置适配器
lv_1.setAdapter(dla);
//设置上下文菜单的监听
lv_1.setOnCreateContextMenuListener(this);
} //上下文菜单被点击
@Override
public boolean onContextItemSelected(MenuItem item) { final BlackNumber bn = data.get(position); switch (item.getItemId())
{
case 0: //修改 final EditText et = new EditText(this); et.setInputType(InputType.TYPE_CLASS_PHONE); et.setText(bn.getPhoneNumber());
//弹出对话框
new AlertDialog.Builder(this)
.setTitle("修改黑名单")
.setView(et)
.setNeutralButton("取消",null)
.setPositiveButton("保存", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//获取修改后的值
bn.setPhoneNumber(et.getText().toString()); //执行数据库修改操作
BlackNumberDAO bnd = new BlackNumberDAO(TestActivity1.this); bnd.update(bn); //更新集合/列表
//bn和data里面的对象同时指向同一个内存地址
//如果bn被修改了,那data里面的对象同时也能够体现出变化来
//这就是引用类型的特点 //通知刷新列表
dla.notifyDataSetChanged(); Toast.makeText(TestActivity1.this, "修改成功", Toast.LENGTH_SHORT).show();
}
}) .show();
break;
case 1: //删除 BlackNumberDAO bd =new BlackNumberDAO(this); //需要id 数据库删除
bd.delete(bn.getId()); //刷新界面
data.remove(position); //通知刷新
dla.notifyDataSetChanged(); Toast.makeText(TestActivity1.this, "删除成功", Toast.LENGTH_SHORT).show(); break;
}
return super.onContextItemSelected(item);
} public void onCreateContextMenu(ContextMenu menu,View v,
ContextMenu.ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu,v,menuInfo);
menu.add(0,0,0,"修改");
menu.add(0,1,1,"删除"); //获取长按的适配器信息
AdapterView.AdapterContextMenuInfo acm = (AdapterView.AdapterContextMenuInfo) menuInfo; position = acm.position;
} //实现列表的适配器
class BlackListAdapter 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) {
//position:要显示的那条记录 //判断可复用的视图是否为空
if (convertView == null)
{
//获取视图
convertView = View.inflate(TestActivity1.this,android.R.layout.simple_list_item_1,null);
}
//给视图绑定数据
TextView tv =(TextView)convertView.findViewById(android.R.id.text1);
tv.setText(data.get(position).getPhoneNumber()); return convertView;
}
} public void bt1_OnClick(View v)
{
final EditText editText = new EditText(this); editText.setHint("请输入电话号码"); editText.setInputType(InputType.TYPE_CLASS_PHONE); //editText.setLayoutParams(new DrawerLayout.LayoutParams()); //editText.setInputType(); //构造自定义对话框
new AlertDialog.Builder(this)
.setTitle("添加黑名单")
.setView(editText)
.setPositiveButton("添加", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { //构造实体类
BlackNumber blacknumber = new BlackNumber(editText.getText().toString()); //调用数据库操作类DAO,保存数据
BlackNumberDAO blackNumberDAO = new BlackNumberDAO(TestActivity1.this); blackNumberDAO.insert(blacknumber); //添加数据到集合的顶部
data.add(0,blacknumber); //通知适配器刷新ListView
dla.notifyDataSetChanged(); Toast.makeText(TestActivity1.this, "数据保存成功", Toast.LENGTH_SHORT).show();
}
})
.setNeutralButton("取消",null)
.show();
}
}

activity_test1.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="16dp"
android:paddingLeft="16dp"
android:paddingTop="16dp"
android:paddingRight="16dp"
tools:context="com.hanqi.test3.TestActivity1"
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:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="还没添加黑名单"
android:gravity="center"
android:id="@android:id/empty"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加"
android:onClick="bt1_OnClick"/> </LinearLayout>

思维导图总结知识点:

效果图:

在没有黑名单号码时,会在界面“提示还没添加黑名单”

长按组件可以实现删除和修改

Android课程---添加黑名单的练习2(课堂讲解)的更多相关文章

  1. Android课程---添加黑名单的练习(课堂讲解)

    DBHelper.java package com.hanqi.test3; import android.content.Context; import android.database.sqlit ...

  2. Android下添加新的自定义键值和按键处理流程

            Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...

  3. Android 数据库管理— — —添加数据

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  4. Android Studio添加PNG图片报错原因

    今天在网上看到一个关于Splash Activity的Android帖子,博主在一通讲解之后也给出了代码.于是果断下载下来了看看怎么实现的.一步步照着流程把这个功能实现了一遍.一切都没有大问题,但是在 ...

  5. Android课程---进度条及菜单的学习

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  6. 在Xcode5和Android Studio添加工程间的依赖

    正在编辑中,尚未完成 先看看ios的target是什么,请先参看http://www.cocoachina.com/bbs/read.php?tid-10884.html做个大概了解 这里有一篇文章, ...

  7. Eclipse / android studio 添加第三方jar包 步骤

    eclipse 将第三方包放到libs文件夹后并没有引用. 基本步骤分为3步,具体介绍如下: 打开自己的Eclipse,在自己的Android工程上名上右键->Build Path ->C ...

  8. Android RecyclerView添加Header头部

     Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...

  9. Android Studio 添加Assets目录

    Android Studio 添加Assets目录: 法一: Since Android Studio uses the new Gradle-based build system, you shou ...

随机推荐

  1. 逻辑思维面试题-java后端面试-遁地龙卷风

    (-1)写在前面 最近参加了一次面试,对笔试题很感兴趣,就回来百度一下.通过对这些题目的思考让我想起了建模中的关联,感觉这些题如果没接触就是从0到1,考验逻辑思维的话从1到100会更好,并且编程简易模 ...

  2. C++ 异常机制

    程序在运行的时候可能产生各种可预料到的异常,例如磁盘不足,内存不足,或是数学运算溢出,数组越界之类的.为了解决这些问题,C++提供了异常处理机制,它一般是由try语句和catch语句构成. 一.try ...

  3. dos 下删除文件、文件夹

    删除文件 /p 删除每一个文件之前提示确认/f 强制删除只读文件 /s 从当前目录及所有子目录删除指定文件/q 安静模式.删除全局通配符时,不要求确认/a 根据属性选择要删除的文件 指定下列文件属性中 ...

  4. 【Maven】搭建Maven环境

    第一步:下载,并安装配置Maven 下载安装包:可以到官网下载(可能很慢),建议从CSDN上下载. 解压安装包:解压到Eclipse和Java一起把,改配置什么的一眼就看到:反正我是把Java,Ecl ...

  5. MySQL备份之【mydumper 学习】

    MySQL在备份方面包含了自身的mysqldump工具,但其只支持单线程工作,这就使得它无法迅速的备份数据.而mydumper作为一个实用工具,能够良好支持多线程工作,这使得它在处理速度方面十倍于传统 ...

  6. vim 用法

    据说,会使用vim之后,你就不想用其他文本编辑器了...反正我是还没有达到那水平 = = 好啦~不扯蛋,进入正题!(以后这个vim 会不断补充资料的 > <) 简单介绍下~ 一.安装vim ...

  7. caffe初试(一)happynear的caffe-windows版本的配置及遇到的问题

    之前已经配置过一次caffe环境了: Caffe初试(一)win7_64bit+VS2013+Opencv2.4.10+CUDA6.5配置Caffe环境 但其中也提到,编译时,用到了cuda6.5,但 ...

  8. unity3d中串口的使用

    工作中遇到了串口的问题,通过查资料&实验写出了下面代码: 关于串口的代码我在网上看了好多,一种是用事件来做,另外一种使用线程来做:(经过试验,unity无法用串口自带的事件进行数据读取): 看 ...

  9. 微信开发之Author网页授权

     微信开发中,经常有这样的需求:获得用户头像.绑定微信号给用户发信息.. 那么实现这些的前提就是授权!   1.配置安全回调域名: 在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的&q ...

  10. 圣诞老人去哪?Power BI告诉你

    随着圣诞节的来临,微软的Power BI团队使用Power BI来回答大家一直以来所关心的问题:圣诞老人去哪? 要回答这个问题,来自社交网络的数据是最合适不过的了.于是Power BI团队用以下关键字 ...