安卓黑名单练习
今天给大家带来一个简单的安卓小练习
首先我们先看一下最终的效果图,大家好有一个印象。
功能描述
1、黑名单添加
2、显示所有的黑名单列表
3、删除指定黑名单
4、修改黑名单
关键技术点
1、Sqlite数据库的而操作(CRUD)
2、ListView的列表显示
3、AlertDialog
4、contextMenu
了解了功能需求后来看一下我们的打开实现步骤
- 显示布局-------ListView
- DBhelper--------数据库–表
- POJO(普通java类)
- DAO(关键部分)
- 添加
显示添加dialog(带输入框)
在确定的回调方法
保存数据到数据库中
保存数据到内存集合中
通知更新列表
?刚刚添加的数据需要保存到第一行
?初始化数据时候需要倒序 - 删除
显示ContextMenu
给ListView设置监听
响应item的选择
删除数据库中的数据
删除List数据
通知更新列表
?如何得到显示的长按的position - 更新
显示Dialog
点击确定
更新数据库中的数据
更新List数据
通知更新列表
取消
在开工之前先给大家看一下我的结构图
第一步: ok,首先我们看一下第一步,在我们的activity_main中布局,一个ListView 加上一个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ListView
android:id="@+id/lv_main"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</ListView>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="addBlackList"
android:text="@string/addBlackList"/>
</LinearLayout>
效果图应该如图所示
还没完,我们有ListView布局,那么就应该对应有item布局
<?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:id="@+id/list_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25sp"/>
</LinearLayout>
第二步:就是我们数据库的建立和black_list表的建立
package com.example.xiaoyuhan.blacklistpractice.DAO;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//建立一个黑名单的表
String sql = "CREATE TABLE black_list(\n" +
"\t_id INTEGER PRIMARY KEY AUTOINCREMENT,\n" +
"\tnumber varchar\n" +
")";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
第三步:pojo----BlackList,这个类也就只有两个属性,evey easy!
package com.example.xiaoyuhan.blacklistpractice.pojo;
//对应表black_list
public class BlackList {
private Integer _id;
private String number;
public BlackList(Integer _id, String number) {
this._id = _id;
this.number = number;
}
public Integer get_id() {
return _id;
}
public void set_id(Integer _id) {
this._id = _id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
@Override
public String toString() {
return "BlackList{" +
"_id=" + _id +
", number='" + number + '\'' +
'}';
}
}
第四步:
也是我们的重点,DAO的建立,首先我们先建立一个借口,定义里面的功能,也就是增删改查!
package com.example.xiaoyuhan.blacklistpractice.DAO;
import com.example.xiaoyuhan.blacklistpractice.pojo.BlackList;
import java.util.List;
public interface BlackListDao {
//添加
void add(BlackList blackList);
//根据id删除
void deleteById(Integer id);
//更新记录
void update(BlackList blackList);
//查询所有的信息
List<BlackList> queryAll();
}
接下来就是我们的实现类,在这个dao实现类里面,我们创建了DBHelper类
package com.example.xiaoyuhan.blacklistpractice.DAO;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.xiaoyuhan.blacklistpractice.pojo.BlackList;
import java.util.ArrayList;
import java.util.List;
public class BlackListDaoImpl implements BlackListDao{
private SQLiteDatabase mDatabase;
private DBHelper helper;
public BlackListDaoImpl(Context context) {
helper = new DBHelper(context, "BlackListPractice.db", null, 1);
mDatabase = helper.getWritableDatabase();
}
@Override
public void add(BlackList blackList) {
if(!mDatabase.isOpen()) {
mDatabase = helper.getWritableDatabase();
}
ContentValues values = new ContentValues();
values.put("number", blackList.getNumber());
long id = mDatabase.insert("black_list", null, values);
blackList.set_id((int) id);
mDatabase.close();
}
@Override
public void deleteById(Integer id) {
if(!mDatabase.isOpen()) {
mDatabase = helper.getWritableDatabase();
}
mDatabase.delete("black_list", "_id="+id, null);
mDatabase.close();
}
@Override
public void update(BlackList blackList) {
if(!mDatabase.isOpen()) {
mDatabase = helper.getWritableDatabase();
}
ContentValues values = new ContentValues();
values.put("number", blackList.getNumber());
mDatabase.update("black_list", values, "_id="+blackList.get_id(), null);
mDatabase.close();
}
@Override
public List<BlackList> queryAll() {
if(!mDatabase.isOpen()) {
mDatabase = helper.getWritableDatabase();
}
List<BlackList> lists = new ArrayList<>();
Cursor cursor = mDatabase.query("black_list", null, null, null,
null, null, "_id desc", null);
while (cursor.moveToNext()){
lists.add(new BlackList(cursor.getInt(0), cursor.getString(1)));
}
cursor.close();
mDatabase.close();
return lists;
}
}
在我们具体的实现之前博主这里先给出MainActivity.java的代码结构,其中的方法会在下面每个步骤中实现
还有就是我们上图中自定义的Adapter的代码这里博主也给出
//自定义的Adapter
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 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = View.inflate(MainActivity.this, R.layout.item_main, null);
}
BlackList blackList = data.get(position);
TextView textView = convertView.findViewById(R.id.list_item);
textView.setText(blackList.getNumber());
return convertView;
}
}
第五步:
现在我们的功能和结构都定义好了,接下来就是我们的具体的实现了,首先是我们的添加功能,我们在activity_main的button按钮中定义了一个addBlackList()函数来响应,我么就在这里面实现这个功能。
public void addBlackList(View view) {
//显示对话框
EditText editText = new EditText(this);
editText.setHint("输入黑名单号");
new AlertDialog.Builder(this)
.setTitle("添加黑名单")
.setView(editText)
.setPositiveButton("添加", (dialog, which)->{
// 保存数据到数据库中
BlackList blist = new BlackList(null, editText.getText().toString());
mBlackListDao.add(blist);
// 保存数据到内存集合中
data.add(0, blist);
// 通知更新列表
mBlackListAdapter.notifyDataSetChanged();
})
.setNegativeButton("取消",null)
.show();
}
第六步:
就是我们删除功能了,删除功能使我们长按item元素弹出来的一个上下文应用菜单选项之一(详见上面的实现步骤)
首先我们先来一个item的监听事件
//给ListView设置监听
mListView.setOnCreateContextMenuListener(((menu, v, menuInfo) -> {
//添加item
menu.add(0, 1, 0, "更新");
menu.add(0, 2, 0, "删除");
//得到position
AdapterView.AdapterContextMenuInfo menuInfo1 = (AdapterView.AdapterContextMenuInfo) menuInfo;
position = menuInfo1.position;
}));
接下来我们完成删除按钮
@Override
public boolean onContextItemSelected(MenuItem item) {
BlackList b = data.get(position);
switch (item.getItemId()){
//更新
case 1:
showUpdateDialog(b);
break;
//删除
case 2:
mBlackListDao.deleteById(b.get_id());
data.remove(position);
mBlackListAdapter.notifyDataSetChanged();
break;
default:
break;
}
return super.onContextItemSelected(item);
}
第七步:
我们的最后一步也就是我们的更新
//显示更新对话框
private void showUpdateDialog(BlackList b) {
EditText editText = new EditText(this);
editText.setSelectAllOnFocus(true);
editText.setText(b.getNumber());
new AlertDialog.Builder(this)
.setTitle("输入号码")
.setView(editText)
.setPositiveButton("修改", ((dialog, which) -> {
b.setNumber(editText.getText().toString());
mBlackListDao.update(b);
mBlackListAdapter.notifyDataSetChanged();
}))
.setNegativeButton("取消",null)
.show();
}
到此,我们的小demo也就完成了,虽然看似功能很简单,但是对于初学者是一个很好的综合性练习。建议大家都把代码敲一次,加深印象