实现黑名单的添加、修改、查询和删除,首先得有封装的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. [BZOJ1146][CTSC2008]网络管理Network

    [BZOJ1146][CTSC2008]网络管理Network 试题描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个 部门之间协同工作,公司搭建 ...

  2. python3简单爬虫

    最近在抽空学了一下python,于量就拿爬是练了下手,不得不说python的上手非常简单.在网上找了一下,大都是python2的帖子,于是随手写了个python3的.代码非常简单就不解释了,直接贴代码 ...

  3. 01 java开发前小知识

    1.常见的dos命令 盘符: 进入指定的盘符下. dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录    注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. c ...

  4. spring集成常用技术的配置

    使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎.数据库连接池.orm框架.缓存服务.邮件服务.rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不 ...

  5. 【leetcode】Evaluate Reverse Polish Notation

    Evaluate Reverse Polish Notation 题目描述: Evaluate the value of an arithmetic expression in Reverse Pol ...

  6. [转载]使用PyQt来编写第一个Python GUI程序

    转载自:http://python.jobbole.com/81276/ 英文版出处:http://pythonforengineers.com/your-first-gui-app-with-pyt ...

  7. 转--脉络清晰的BP神经网络讲解,赞

    http://www.cnblogs.com/wengzilin/archive/2013/04/24/3041019.html 学 习是神经网络一种最重要也最令人注目的特点.在神经网络的发展进程中, ...

  8. SQL Server 数据库巡检脚本

    --1.查看数据库版本信息 select @@version --2.查看所有数据库名称及大小 exec sp_helpdb --3.查看数据库所在机器的操作系统参数 exec master..xp_ ...

  9. eclipse调试solr

    eclipse调试solr 现在solr的源码包,我这里是4.10.2, 编译, ant ivy-bootstrap ant eclipse 导入elipse,将solr/example/solr/下 ...

  10. 修改Windows Server 2008密码策略,设置简单密码

    最长使用期限为0表示密码永不过期. 如果是VBOX虚拟机安装,在使用共享文件夹功能时候,需要打开控制面板--网络和共享中心--共享设置--启动网络发现.然后才能映射共享文件夹