Android——黑名单管理(二)
说明:多加一点完善
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(); } }