Android课程---添加黑名单的练习2(课堂讲解)
实现黑名单的添加、修改、查询和删除,首先得有封装的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(课堂讲解)的更多相关文章
- Android课程---添加黑名单的练习(课堂讲解)
DBHelper.java package com.hanqi.test3; import android.content.Context; import android.database.sqlit ...
- Android下添加新的自定义键值和按键处理流程
Android下添加新的自定义键值和按键处理流程 说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...
- Android 数据库管理— — —添加数据
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...
- Android Studio添加PNG图片报错原因
今天在网上看到一个关于Splash Activity的Android帖子,博主在一通讲解之后也给出了代码.于是果断下载下来了看看怎么实现的.一步步照着流程把这个功能实现了一遍.一切都没有大问题,但是在 ...
- Android课程---进度条及菜单的学习
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 在Xcode5和Android Studio添加工程间的依赖
正在编辑中,尚未完成 先看看ios的target是什么,请先参看http://www.cocoachina.com/bbs/read.php?tid-10884.html做个大概了解 这里有一篇文章, ...
- Eclipse / android studio 添加第三方jar包 步骤
eclipse 将第三方包放到libs文件夹后并没有引用. 基本步骤分为3步,具体介绍如下: 打开自己的Eclipse,在自己的Android工程上名上右键->Build Path ->C ...
- Android RecyclerView添加Header头部
Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...
- Android Studio 添加Assets目录
Android Studio 添加Assets目录: 法一: Since Android Studio uses the new Gradle-based build system, you shou ...
随机推荐
- Linux线程同步:条件变量
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用.使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化.一旦其它 ...
- C和指针 第六章 数组名与指针
指针的算术运算符是指针和数组之间的一种关联,但不是唯一关联: 可以使用数组名作为指向数组第一个元素的指针,但是不可以给数组名赋新的值. //如下声明a int a[10]; //用a作为指向数组第一个 ...
- git 教程(15)--分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...
- Android 如何在 ListView 中更新 ProgressBar 进度
=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...
- Python递归及斐波那契数列
递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...
- OSSFS将OSS bucket 挂载到本地文件系统及注意事项
OSSFS将OSS bucket 挂载到本地文件系统及注意事项 下载ossfs安装包 wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/as ...
- filedownload
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLIC "-/ ...
- linux6的yum源
[base]name=CentOS-$releasever-Basebaseurl=http://centos.ustc.edu.cn/centos/6/os/x86_64/gpgcheck=1gpg ...
- 关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)
我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...
- Android 小笔记
<!-- xml --> android:visibility="gone" 可以隐藏 元素 xmlns:bootstrapbu ...