安卓黑名单练习

今天给大家带来一个简单的安卓小练习
首先我们先看一下最终的效果图,大家好有一个印象。
安卓综合性练习-LMLPHP

功能描述

1、黑名单添加
2、显示所有的黑名单列表
3、删除指定黑名单
4、修改黑名单

关键技术点

1、Sqlite数据库的而操作(CRUD)
2、ListView的列表显示
3、AlertDialog
4、contextMenu
  1. 显示布局-------ListView
  2. DBhelper--------数据库–表
  3. POJO(普通java类)
  4. DAO(关键部分)
  5. 添加
    显示添加dialog(带输入框)
    在确定的回调方法
    保存数据到数据库中
    保存数据到内存集合中
    通知更新列表
    ?刚刚添加的数据需要保存到第一行
    ?初始化数据时候需要倒序
  6. 删除
    显示ContextMenu
    给ListView设置监听
    响应item的选择
    删除数据库中的数据
    删除List数据
    通知更新列表
    ?如何得到显示的长按的position
  7. 更新
    显示Dialog
    点击确定
    更新数据库中的数据
    更新List数据
    通知更新列表
    取消

在开工之前先给大家看一下我的结构图
安卓综合性练习-LMLPHP

第一步: 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>

效果图应该如图所示
安卓综合性练习-LMLPHP
还没完,我们有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的代码结构,其中的方法会在下面每个步骤中实现
安卓综合性练习-LMLPHP
还有就是我们上图中自定义的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也就完成了,虽然看似功能很简单,但是对于初学者是一个很好的综合性练习。建议大家都把代码敲一次,加深印象

10-07 14:53