<?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.hanqi.blacklist.MainActivity"
android:orientation="vertical"> <ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/lv_1">
</ListView>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加黑名单"
android:onClick="add_onClick"/>
</LinearLayout>

activity_main

 package com.hanqi.blacklist.com.hanqi.blacklist.orm;

 /**
* Created by lenovo on 2016/6/6.
*/
//实体类
public class BlacList { private long id;
private String phoneNumber; 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 BlacList(long id, String phoneNumber) {
this.id = id;
this.phoneNumber = phoneNumber;
} public BlacList(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}

BlacList

 package com.hanqi.blacklist.com.hanqi.blacklist.orm;

 import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; /**
* Created by lenovo on 2016/6/6.
*/
//数据库操作类
public class BlackListDAO { //private Context context;
private final String TABLE_NAME = "t_blacklist";
private DBHelper dh; public BlackListDAO(Context context)
{
//this.context = context;
dh = new DBHelper(context);
}
//增
//传入参数:实体类的实例
public long insert(BlacList blacList)
{
long rtn = 0;
//链接数据库
SQLiteDatabase sd = dh.getWritableDatabase();
//执行insert语句
//insert into t_blacklist (phone_number) values ()
ContentValues cv = new ContentValues();
cv.put("phone_number",blacList.getPhoneNumber());
rtn = sd.insert("t_blacklist",null,cv);
sd.close();
return rtn;
}
//删
public int delete(long id)
{
int rtn = 0;
//链接数据库
SQLiteDatabase sd = dh.getWritableDatabase();
//delete from t_blacklist where _id = ?
rtn = sd.delete(TABLE_NAME,"_id = ?",new String[]{id+""});
sd.close();
return rtn;
}
//改
public int update(BlacList blacList)
{
int rtn = 0;
//链接数据库
SQLiteDatabase sd = dh.getWritableDatabase();
//update t_blacklist set phone_number = ? where _id = ?
ContentValues cv = new ContentValues();
cv.put("phone_number",blacList.getPhoneNumber());
rtn = sd.update(TABLE_NAME,cv,"_id =?",new String[]{blacList.getId()+""});
sd.close();
return rtn;
}
//查
//返回查询结果
public ArrayList<BlacList> getAll()
{
ArrayList<BlacList> blacLists = new ArrayList<>();
//链接数据库
SQLiteDatabase sd = dh.getWritableDatabase();
//select * from t_blacklist
//查询之后得到游标结果集
Cursor cursor = sd.query(TABLE_NAME, null, null, null, null, null, "_id desc");
//遍历结果集
while (cursor.moveToNext())
{
//1.把数据转成实体类的实例
BlacList blacList = new BlacList(cursor.getLong(0),cursor.getString(1));
//2.把实例放在集合里,返回这个集合
blacLists.add(blacList);
}
cursor.close();
sd.close();
//返回这个集合
return blacLists;
}
}

BlackListDAO

 package com.hanqi.blacklist.com.hanqi.blacklist.orm;

 import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log; /**
* Created by lenovo on 2016/6/7.
*/
public class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) {
super(context, "blacklist.db", null, 1);
} @Override
public void onCreate(SQLiteDatabase db) { //1.执行创建数据库的语句
String sql = "CREATE TABLE t_blacklist " +
"(_id INTEGER NOT NULL," +
"phone_number VARCHAR(20) NOT NULL,"
+"PRIMARY KEY (\"_id\"))";
db.execSQL(sql);
Log.e("TAG", "表创建成功");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

DBHelper

 package com.hanqi.blacklist;

 import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
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 com.hanqi.blacklist.com.hanqi.blacklist.orm.BlacList;
import com.hanqi.blacklist.com.hanqi.blacklist.orm.BlackListDAO; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { ListView lv_1;
//数据访问对象
BlackListDAO bld = new BlackListDAO(this);
//数据集合
ArrayList<BlacList> alb; BLAdapter bla; //长按数据的索引
int index; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_1 = (ListView)findViewById(R.id.lv_1);
//增加上下文菜单,设置创建上下文菜单的监听器
lv_1.setOnCreateContextMenuListener(this);
//获取数据集合
alb = bld.getAll();
//显示数据
//adapter
bla = new BLAdapter();
lv_1.setAdapter(bla);
}
//重写创建上下文菜单的方法
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, 1, 1, "修改");
menu.add(0, 2, 2, "删除");
//获取长按的数据信息
//1.得到菜单信息
AdapterView.AdapterContextMenuInfo acmi =
(AdapterView.AdapterContextMenuInfo)menuInfo;
//2.得到数据在集合中的索引
index = acmi.position;
}
//响应菜单点击的回调方法
@Override
public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId())
{
case 1:
//修改
final EditText editText = new EditText(this);
editText.setHint("输入电话号码");
editText.setInputType(InputType.TYPE_CLASS_PHONE);
editText.setText(alb.get(index).getPhoneNumber());
new AlertDialog.Builder(this)
.setTitle("修改")
.setView(editText)
.setCancelable(false)
.setNegativeButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// BlacList blacList = new BlacList(alb.get(index).getId(),editText.getText().toString());
// bld.update(blacList);
// alb = bld.getAll();
// bla.notifyDataSetChanged();
//1.得到新数据的实体类
//赋值:
// 1)传值,复制新的值再传递,值类型;
// 2)传址,传递的是内存的地址,指向同一个对象,引用类型
BlacList blaclist = alb.get(index);
blaclist.setPhoneNumber(editText.getText().toString());
//2.调用DAO的update()
if (bld.update(blaclist)>0)
{
Toast.makeText(MainActivity.this, "修改成功", Toast.LENGTH_SHORT).show(); bla.notifyDataSetChanged();
}
else
{
Toast.makeText(MainActivity.this, "修改失败", Toast.LENGTH_SHORT).show();
}
}
})
.show();
break;
case 2:
//添加删除确认对话框
//删除
new AlertDialog.Builder(this)
.setTitle("确认对话框")
.setMessage("确认删除么?")
.setNegativeButton("取消", null)
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
bld.delete(alb.get(index).getId());
Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
//alb = bld.getAll();
alb.remove(index);
bla.notifyDataSetChanged();
}
})
.show(); break;
}
return super.onContextItemSelected(item);
} //BaseAdapter的实现类
class BLAdapter extends BaseAdapter
{
@Override
public int getCount() {
return alb.size();
} @Override
public Object getItem(int position) {
return alb.get(position);
} @Override
public long getItemId(int position) {
return alb.get(position).getId();
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
//得到数据
BlacList blacList = alb.get(position);
//得到视图
if (convertView == null)
{
//构建视图
convertView = new TextView(MainActivity.this);
}
//视图和数据做显示匹配
TextView textView = (TextView)convertView;
textView.setTextSize(20);
textView.setHeight(80);
textView.setText(blacList.getPhoneNumber());
return textView;
}
}
//添加
public void add_onClick(View v)
{
//自定义对话框
final EditText editText = new EditText(this);
editText.setHint("输入电话号码");
editText.setInputType(InputType.TYPE_CLASS_PHONE);
//构建对话框
new AlertDialog.Builder(this)
.setTitle("添加黑名单")
.setView(editText)
.setCancelable(false)
.setNegativeButton("取消", null)
.setPositiveButton("保存", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//向数据库保存
//1.定义实体类
BlacList blacList = new BlacList(editText.getText().toString());
//2.通过DAO插入数据
long l = bld.insert(blacList);
if (l > 0) {
Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
//更新list
//alb = bld.getAll();
blacList.setId(l);
alb.add(0,blacList);
//刷新列表
bla.notifyDataSetChanged();
}
else {
Toast.makeText(MainActivity.this, "保存失败", Toast.LENGTH_SHORT).show();
}
}
})
.show();
}
}

MainActivity

Android——黑名单的更多相关文章

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

    实现黑名单的添加.修改.查询和删除,首先得有封装的3个类,便于使用 BlackNumber.java package com.hanqi.test3; /** * Created by Adminis ...

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

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

  3. android 小项目------黑名单app

    周一的时候,同事在群里问到了黑名单功能,他说网上都没有找到一个完整的,记得谁说过一句,当都没有做过的时候,这就是机会.这几天公司事比较多,只能晚上抽时间写写,直到今天才完整的做出来. 具体效果的话大家 ...

  4. Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板

    对于想要拦截一些莫名的陌生号码,就需要电话拦截功能与删除其电话记录功能.拦截的主要业务逻辑,分别是在一个服务里面进行:1.注册电话监听:2.取消注册电话监听(当然注册于取消是在服务里面建立一个广播接收 ...

  5. Android HTTPS(4)直接用SSLSocket,黑名单,客户端证书

    Warnings About Using SSLSocket Directly So far, the examples have focused on HTTPS using HttpsURLCon ...

  6. Android插件化的兼容性(下):突破Android P中灰黑名单的限制

    在Android P系统中,加入了访问私有API接口的限制.

  7. 黑名单机制来临,你的应用还好么?Android P DP2最新兼容性报告出炉

    5月9日,谷歌面向全球开发者发布了 Android P Beta,即 Android P DP2. 华为终端开放实验室第一时间对TOP1000主流应用兼容性进行测试,那么在版本兼容性方面各主流应用有何 ...

  8. Android应用安全开发之浅谈网页打开APP

    一.网页打开APP简介 Android有一个特性,可以通过点击网页内的某个链接打开APP,或者在其他APP中通过点击某个链接打开另外一个APP(AppLink),一些用户量比较大的APP,已经通过发布 ...

  9. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

随机推荐

  1. linux环境下安装jdk

    1.查看系统自带的jdk #RPM -qa|grep jdk 若存在则删除 jdk-1.7.0_67-fcs.x86_64 #rpm -e --nodeps jdk-1.7.0_67-fcs.x86_ ...

  2. AX2012自定义注释脚本开发

    废话少说,直接进入主题: 1.在类xppSource中增加一个类似的方法: eg. Source ifElse(Source _condition = '', Source _ifStatement ...

  3. c语言-四阶龙格-库塔法

    #include<stdio.h> #include<math.h> #define n 14 //double func1(double x, double y); doub ...

  4. web 页面上纯js实现按钮倒计数功能

    需求构思:本功能想实现的是,一个按钮在页面载入就显示提醒续费,,,倒数60秒后,完成提醒功能,可以按另外一个页面跳转到主页. 参考网上的大神,实现如下:Button2倒数,Button3跳转,在页面上 ...

  5. Yosemite系统怎么录制 iOS8设备屏幕

    我一年前一直想要的一个功能,发布时很想用.一直没找到 ,很巧的是今天被测试发现了. 感谢CCTV.自己在这里也记录下: 你好!    在 OS X Yosemite  系统中,QuickTime 支持 ...

  6. 调用javaAPI访问hive

    jdbc远程连接hiveserver2 2016-04-26 15:59 本站整理 浏览(425)     在之前的学习和实践Hive中,使用的都是CLI或者hive –e的方式,该方式仅允许使用Hi ...

  7. 按月统计tcode和report使用次数的工具

    执行report,输入要查询的日期和user, 工具会按照使用次数从高到低列出输入日期所在的月份内所有该user 曾经使用过的tcode 和report list: REPORT zusertcode ...

  8. 关于seajs模块化的搭建

    搭建seajs这个鬼吧!好像必须要用服务器起.... 然后我开始弄了个nodejs服务器. 安装nodejs:在网站上下载,安装,安装.. 打开命令行,输入cdm. 输入node -v ,输出版本信息 ...

  9. bootstraps字体图标无法显示

    使用bootstraps字体图标,必须在css的同级文件夹下,建立新的文件夹为fonts,放入一下文件. 在还是无法显示字体图标的情况下,可查看bootstraps.css中的 @font-face ...

  10. python bytes to string

    python bytes 转化成 string 会遇到如下错误: codec can't decode byte 0xff in position 5: illegal multibyte seque ...