安卓做业----慕课移动应用开发做业21之使用Sqlite+RecyclerView+Dialog对数据进行增删改查

2020年05月21日 阅读数:88
这篇文章主要向大家介绍安卓做业----慕课移动应用开发做业21之使用Sqlite+RecyclerView+Dialog对数据进行增删改查,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

本篇使用Sqlite+RecyclerView+Dialog对数据进行增删改查java

同时这也是中国大学慕课移动终端应用开发的网课做业21android

原题目要求:
(1)经过“添加联系人”按钮,跳转到“添加”信息的Dialog输入用户名、联系电话、地址选择性别,添加后显示到联系人列表。
(2)点击 联系人中的项,能够弹出Dialog,修改联系人信息或者删除联系人。
(3)能够经过输入姓名进行联系人信息的查找,并给出信息。web

说明

1.此篇博文是代码部分,一些有关于实现的细节,感兴趣的同窗能够看一下此篇博文
2.建议阅读《安卓编程权威指南3》,里面有关Sqlite的代码的格式值得学习,或者说,整本书的代码风格都是值得学习的
3.我会持续更新个人做业,关注不迷路哈数据库

效果图

在这里插入图片描述

代码

目录结构

这是个人目录结构,adapter包下是适配器,dao包下是访问数据库的接口和实现方法,database包下是一些有关数据库的类,dialog包下是自定义对话框,model包下是数据模型
在这里插入图片描述编程

添加依赖

因为使用了RecyclerView,因此得添加依赖
在这里插入图片描述app

implementation 'com.android.support:recyclerview-v7:28.0.0'
具体代码
1.User.java
public class User {
    private UUID id;
    private String name;
    private String phone;
    private String address;
    private int sex;

    public User() {
    }

    public UUID getId() {
        return id;
    }

    public void setId(UUID id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public User(UUID id, String name, String phone, String address, int sex) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.sex = sex;
    }

    public User(String name, String phone, String address, int sex) {
        this.id =UUID.randomUUID();
        this.name = name;
        this.phone = phone;
        this.address = address;
        this.sex = sex;
    }
}
2.UserCursorWrapper.java
public class UserCursorWrapper extends CursorWrapper {

    /**
     * Creates a cursor wrapper.
     *
     * @param cursor The underlying cursor to wrap.
     */
    public UserCursorWrapper(Cursor cursor) {
        super(cursor);
    }

    public User getUser(){
        //获取每行数据
        String uuidString = getString(getColumnIndex(UserDbSchema.UserTable.Columns.UUID));
        String name = getString(getColumnIndex(UserDbSchema.UserTable.Columns.NAME));
        String phone = getString(getColumnIndex(UserDbSchema.UserTable.Columns.PHONE));
        String address = getString(getColumnIndex(UserDbSchema.UserTable.Columns.ADDRESS));
        int sex = getInt(getColumnIndex(UserDbSchema.UserTable.Columns.SEX));

        return new User(UUID.fromString(uuidString),name,phone,address,sex);
    }
}
3.UserDbSchema.java
public class UserDbSchema {
    //利用内部类定义user表结构
    public static final class UserTable{
        //定义表名
        public static final String TABLE_NAME = "user";

        //定义数据表字段
        public static final class Columns{
            public static final String UUID = "uuid";
            public static final String NAME = "name";
            public static final String PHONE = "phone";
            public static final String ADDRESS = "address";
            public static final String SEX = "sex";
        }
    }
}

4.UserSqlHelper.java
public class UserSqlHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;//定义版本
    private static final String DATABASE_NAME = "course21DataBase";


    public UserSqlHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        /**
            此时数据库是没有被建立或者打开的,
            直到getReadableDatabase,getWritableDatabase这两个方法其中一个被调用
         */
        db.execSQL("create table "+ UserDbSchema.UserTable.TABLE_NAME+
                "("+"_id integer primary key autoincrement,"+
                UserDbSchema.UserTable.Columns.UUID+","+
                UserDbSchema.UserTable.Columns.NAME+","+
                UserDbSchema.UserTable.Columns.PHONE+","+
                UserDbSchema.UserTable.Columns.ADDRESS+","+
                UserDbSchema.UserTable.Columns.SEX+")"
        );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //不更新数据库
    }
}
5.IUserDao.java
public interface IUserDao {
    /**
     * 获取全部用户信息
     * */
    ArrayList<User> getAllUser();

    /**
     * 获取指定名字的用户信息,默认名字不重复
     * */
    User getUserByName(String name);

    /**
     *添加用户信息
     * */
    void addUser(User user);

    /**
     * 修改指定用户信息
     * */
    void updateUser(User user);

    /**
     * 删除指定用户信息
     * */
    void deleteUser(User user);

}

6.UserDao.java
public class UserDao implements IUserDao{
    private static UserDao sUserDao;

    private Context mContext;
    private SQLiteDatabase mDatabase;

    public UserDao(Context context) {
        mContext = context.getApplicationContext();
        mDatabase = new UserSqlHelper(mContext).getWritableDatabase();//此时数据库才是可写的
    }

    /**
     * 全局保留一个userDao实例
     * */
    public static UserDao getUserDao(Context context){
        if (sUserDao == null){
            sUserDao = new UserDao(context);
        }
        return sUserDao;
    }

    /**
     * 获取全部用户信息
     */
    @Override
    public ArrayList<User> getAllUser() {
        ArrayList<User> users = new ArrayList<>();
        UserCursorWrapper cursorWrapper = queryUsers(null,null);

        try {
            cursorWrapper.moveToFirst();
            while (!cursorWrapper.isAfterLast()){
                users.add(cursorWrapper.getUser());
                cursorWrapper.moveToNext();
            }
        } finally {
            cursorWrapper.close();
        }

        return users;
    }

    /**
     * 获取指定名字的用户信息,默认名字不重复
     *
     * @param name
     */
    @Override
    public User getUserByName(String name) {
        //定义查询条件
        String whereClause = UserDbSchema.UserTable.Columns.NAME + " = ?";
        String [] whereArgs = new String[]{ name };
        UserCursorWrapper cursorWrapper = queryUsers(whereClause,whereArgs);

        try {
            //查询失败
            if (cursorWrapper.getCount() == 0){
                return null;
            }
            cursorWrapper.moveToFirst();
            return cursorWrapper.getUser();
        } finally {
            //关闭
            cursorWrapper.close();
        }
    }

    /**
     * 添加用户信息
     *
     * @param user
     */
    @Override
    public void addUser(User user) {
        //防止传入空值
        if (user!=null){
            ContentValues values = getContentValues(user);
            //插入数据
            mDatabase.insert(UserDbSchema.UserTable.TABLE_NAME,null,values);
        }
    }

    /**
     * 修改指定用户信息
     *
     * @param user
     */
    @Override
    public void updateUser(User user) {
        String uuidString = user.getId().toString();
        ContentValues values = getContentValues(user);
        mDatabase.update(UserDbSchema.UserTable.TABLE_NAME,
                values,
                UserDbSchema.UserTable.Columns.UUID+" = ? ",
                new String[] { uuidString });
    }

    /**
     * 删除指定用户信息
     *
     * @param user
     */
    @Override
    public void deleteUser(User user) {
        String uuidString = user.getId().toString();
        mDatabase.delete(UserDbSchema.UserTable.TABLE_NAME,
                UserDbSchema.UserTable.Columns.UUID+" = ? ",
                new String[] { uuidString });
    }

    //私有方法,返回一个ContentValues对象
    private ContentValues getContentValues(User user){
        ContentValues values = new ContentValues();
        //添加键值对
        values.put(UserDbSchema.UserTable.Columns.UUID,user.getId().toString());
        values.put(UserDbSchema.UserTable.Columns.NAME,user.getName());
        values.put(UserDbSchema.UserTable.Columns.PHONE,user.getPhone());
        values.put(UserDbSchema.UserTable.Columns.ADDRESS,user.getAddress());
        values.put(UserDbSchema.UserTable.Columns.SEX,user.getSex());
        return values;
    }

    /**
     *  查询记录,返回一个CursorWrapper对象,能够调用里面的getUser()方法得到User值
     *
     *  无论是查询特殊仍是所有,均可以调用此方法
     */
    private UserCursorWrapper queryUsers(String whereClause,String [] whereArgs){
        Cursor cursor = mDatabase.query(
                UserDbSchema.UserTable.TABLE_NAME,
                null,
                whereClause,
                whereArgs,
                null,
                null,
                null
        );

        return new UserCursorWrapper(cursor);
    }
}
7.UserAdapter.java
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder>{
    private ArrayList<User> mUsers;
    private Context mContext;//上下文对象
    private LayoutInflater mInflater;

    private DialogListener mListener = new DialogListener() {
        @Override
        public void sendMessage() {
            updateView();
        }
    };

    public UserAdapter(Context context,ArrayList<User> users) {
        mUsers = users;
        mContext = context;
        mInflater = LayoutInflater.from(mContext);

    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.info_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder,int position) {
//        mPosition = position;
        final User user = mUsers.get(position);
        //性别决定照片
        holder.mImageView.setImageResource(user.getSex()==1?R.drawable.boy:R.drawable.girl);
        holder.mTextViewPhone.setText("电话: "+user.getPhone());
        holder.mTextViewName.setText(user.getName());
        holder.mTextViewAddress.setText("地址: "+user.getAddress());
        //点击以后弹出一个对话框
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UpdateDialog dialog = new UpdateDialog(mContext,user,mListener);
                dialog.show();
            }
        });
    }

    public void updateView(){
        mUsers =  UserDao.getUserDao(mContext).getAllUser();
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return mUsers.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder{
        public ImageView mImageView;
        public TextView mTextViewName,mTextViewAddress,mTextViewPhone;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            mImageView = itemView.findViewById(R.id.info_image);
            mTextViewName = itemView.findViewById(R.id.info_name);
            mTextViewAddress = itemView.findViewById(R.id.info_address);
            mTextViewPhone = itemView.findViewById(R.id.info_phone);
        }
    }
}

8.AddDialog.java
public class AddDialog extends Dialog {
    private EditText mEditTextName,mEditTextAddress,mEditTextPhone;
    private Button mButtonAdd,mButtonCancel;
    private RadioGroup mRadioGroup;
    private int sex = 1;//性别
    private Context mContext;
    private DialogListener mListener;

    public AddDialog(@NonNull Context context, DialogListener listener) {
        super(context);
        this.mContext = context;
        this.mListener = listener;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_dialog_layout);

        initView();

        mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId){
                    case R.id.add_radio_sex_boy:
                        sex = 1;
                        break;
                    case R.id.add_radio_sex_girl:
                        sex = 0;
                        break;
                }
            }
        });

        mButtonCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });

        mButtonAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = mEditTextName.getText().toString();
                String address = mEditTextAddress.getText().toString();
                String phone = mEditTextPhone.getText().toString();
                User user = new User(name,phone,address,sex);

                UserDao.getUserDao(mContext).addUser(user);

                mListener.sendMessage();
                dismiss();

            }
        });

        setCanceledOnTouchOutside(false);
    }

    //初始化界面
    private void initView(){
        mEditTextName = findViewById(R.id.edit_add_name);
        mEditTextAddress = findViewById(R.id.edit_add_address);
        mEditTextPhone = findViewById(R.id.edit_add_phone);

        mButtonAdd = findViewById(R.id.button_add_add);
        mButtonCancel = findViewById(R.id.button_add_cancel);

        mRadioGroup = findViewById(R.id.add_radio_sex);

    }
}
9.AddDialog对应布局 add_dialog_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="250dp"
    android:layout_height="400dp"
    android:background="#FDF5F5">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="80dp">
        <TextView
            android:layout_centerInParent="true"
            android:textSize="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="添加联系人"/>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#ccc"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"/>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
        <LinearLayout
            android:layout_centerInParent="true"
            android:background="#E2E7FC"
            android:layout_width="180dp"
            android:layout_height="200dp"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:text="姓名:"
                    android:layout_marginLeft="10dp"
                    android:layout_gravity="center"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <EditText
                    android:id="@+id/edit_add_name"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent"
                    android:textSize="12dp"
                    android:hint="请输入..."/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:text="性别:"
                    android:layout_marginLeft="10dp"
                    android:layout_gravity="center"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <RadioGroup
                    android:id="@+id/add_radio_sex"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:orientation="horizontal" >
                    <RadioButton
                        android:id="@+id/add_radio_sex_boy"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:checked="true"
                        android:text="" />
                    <RadioButton
                        android:id="@+id/add_radio_sex_girl"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="" />
                </RadioGroup>
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:text="电话:"
                    android:layout_marginLeft="10dp"
                    android:layout_gravity="center"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <EditText
                    android:id="@+id/edit_add_phone"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent"
                    android:textSize="12dp"
                    android:hint="请输入..."/>

            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:text="地址:"
                    android:layout_marginLeft="10dp"
                    android:layout_gravity="center"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <EditText
                    android:id="@+id/edit_add_address"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent"
                    android:textSize="12dp"
                    android:hint="请输入..."/>

            </LinearLayout>

        </LinearLayout>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#ccc"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <Button
            android:id="@+id/button_add_add"
            android:textSize="12dp"
            android:layout_width="0dp"
            android:layout_gravity="center"
            android:layout_weight="3"
            android:layout_height="40dp"
            android:text="添加"/>
        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>
        <Button
            android:id="@+id/button_add_cancel"
            android:text="取消"
            android:layout_width="0dp"
            android:layout_weight="3"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:textSize="12dp"/>
    </LinearLayout>
</LinearLayout>
10. UpdateDialog.java
public class UpdateDialog extends Dialog {
    public User mUser;//弹框须要展现的信息

    private EditText mEditTextName,mEditTextAddress,mEditTextPhone;
    private Button mButtonUpdate,mButtonDelete,mButtonCancel;
    private RadioGroup mRadioGroup;
    private int sex;
    private ImageView mImageView;
    private DialogListener mListener;
    private Context mContext;

    public UpdateDialog(@NonNull Context context,User user, DialogListener listener) {
        super(context);
        this.mUser = user;
        this.mContext = context;
        this.mListener = listener;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.update_dialog_layout);

        initView();

        mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId){
                    case R.id.update_radio_sex_boy:
                        sex = 1;
                        break;
                    case R.id.update_radio_sex_girl:
                        sex = 0;
                        break;
                }
            }
        });

        //删除按钮操做
        mButtonDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserDao.getUserDao(mContext).deleteUser(mUser);
                mListener.sendMessage();
                dismiss();
            }
        });

        mButtonCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });

        mButtonUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                tag = 2;
                String name = mEditTextName.getText().toString();
                String address = mEditTextAddress.getText().toString();
                String phone = mEditTextPhone.getText().toString();
                User user = new User(mUser.getId(),name,phone,address,sex);
                UserDao.getUserDao(mContext).updateUser(user);
                mListener.sendMessage();
                dismiss();
            }
        });

        setCanceledOnTouchOutside(false);
    }

    //初始化界面
    private void initView(){
        mEditTextName = findViewById(R.id.edit_update_name);
        mEditTextAddress = findViewById(R.id.edit_update_address);
        mEditTextPhone = findViewById(R.id.edit_update_phone);
        mButtonUpdate = findViewById(R.id.button_update_update);
        mButtonCancel = findViewById(R.id.button_update_cancel);
        mButtonDelete = findViewById(R.id.button_update_delete);
        mRadioGroup = findViewById(R.id.update_radio_sex);
        mImageView = findViewById(R.id.image_update);

        sex = mUser.getSex();

        //初始化内容
        mRadioGroup.check(mUser.getSex()==1?R.id.update_radio_sex_boy:R.id.update_radio_sex_girl);
        mEditTextName.setText(mUser.getName());
        mEditTextPhone.setText(mUser.getPhone());
        mEditTextAddress.setText(mUser.getAddress());
        mImageView.setImageResource(mUser.getSex()==1?R.drawable.boy:R.drawable.girl);


    }
}
11. UpdateDialog对应布局 update_dialog_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="250dp"
    android:layout_height="400dp"
    android:background="#FDF5F5">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="80dp">
        <ImageView
            android:id="@+id/image_update"
            android:src="@drawable/girl"
            android:layout_centerInParent="true"
            android:layout_width="60dp"
            android:layout_height="60dp"/>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#ccc"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"/>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
        <LinearLayout
            android:layout_centerInParent="true"
            android:background="#E2E7FC"
            android:layout_width="180dp"
            android:layout_height="200dp"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:text="姓名:"
                    android:layout_marginLeft="10dp"
                    android:layout_gravity="center"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <EditText
                    android:id="@+id/edit_update_name"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent"
                    android:textSize="12dp"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:text="性别:"
                    android:layout_marginLeft="10dp"
                    android:layout_gravity="center"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <RadioGroup
                    android:id="@+id/update_radio_sex"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:orientation="horizontal" >
                    <RadioButton
                        android:id="@+id/update_radio_sex_boy"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:checked="true"
                        android:text="" />
                    <RadioButton
                        android:id="@+id/update_radio_sex_girl"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="" />
                </RadioGroup>
            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:text="电话:"
                    android:layout_marginLeft="10dp"
                    android:layout_gravity="center"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <EditText
                    android:id="@+id/edit_update_phone"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent"
                    android:textSize="12dp"/>

            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:text="地址:"
                    android:layout_marginLeft="10dp"
                    android:layout_gravity="center"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <EditText
                    android:id="@+id/edit_update_address"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="match_parent"
                    android:textSize="12dp"/>

            </LinearLayout>

        </LinearLayout>
    </RelativeLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#ccc"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <Button
            android:id="@+id/button_update_delete"
            android:textSize="12dp"
            android:layout_width="0dp"
            android:layout_gravity="center"
            android:layout_weight="3"
            android:layout_height="40dp"
            android:text="删除"/>
        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>
        <Button
            android:id="@+id/button_update_update"
            android:layout_width="0dp"
            android:layout_weight="3"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:text="修改"
            android:textSize="12dp"/>
        <TextView
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"/>
        <Button
            android:id="@+id/button_update_cancel"
            android:text="取消"
            android:layout_width="0dp"
            android:layout_weight="3"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:textSize="12dp"/>
    </LinearLayout>
</LinearLayout>
12 DialogListener.java
public interface DialogListener {
    void sendMessage();
}
13.MainActivity.java
public class MainActivity extends AppCompatActivity{
    private Button mButtonAdd;
    private RecyclerView mRecyclerView;
    private UserAdapter mAdapter;
    private ArrayList<User> mUsers;
    private ImageView mImageView;
    private EditText mEditText;

    private DialogListener mListener = new DialogListener() {
        @Override
        public void sendMessage() {
            mAdapter.updateView();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().hide();
        init();
        initData();

        mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        mAdapter = new UserAdapter(MainActivity.this,mUsers);
        mRecyclerView.setAdapter(mAdapter);

        mButtonAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AddDialog(MainActivity.this,mListener).show();
            }
        });

        //点击查找
        mImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = mEditText.getText().toString();
                if (name.equals("")){
                    Toast.makeText(MainActivity.this,"查询名字不容许为空",Toast.LENGTH_SHORT).show();
                }else {
                    User user = UserDao.getUserDao(MainActivity.this).getUserByName(name);
                    UpdateDialog dialog = new UpdateDialog(MainActivity.this,user,mListener);
                    dialog.show();
                }
            }
        });
    }

    private void init(){
        mButtonAdd = findViewById(R.id.main_button_add);
        mRecyclerView = findViewById(R.id.main_recycler_view);
        mEditText = findViewById(R.id.main_edit_name);
        mImageView = findViewById(R.id.main_image_find);
    }

    void initData(){
        mUsers = UserDao.getUserDao(MainActivity.this).getAllUser();
    }

}

14.主布局文件activity_main.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">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp">
    <EditText
        android:id="@+id/main_edit_name"
        android:layout_gravity="bottom"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:hint="请输入须要查询的名字"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="10dp"/>
        <RelativeLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1">
            <ImageView
                android:id="@+id/main_image_find"
                android:src="@drawable/find"
                android:layout_width="35dp"
                android:layout_height="35dp"
                android:layout_centerInParent="true"/>
        </RelativeLayout>
    </LinearLayout>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/main_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <Button
        android:id="@+id/main_button_add"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="添加联系人"/>

</LinearLayout>
15.子布局文件 info_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="100dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
        <RelativeLayout
            android:background="#F8F4D3"
            android:layout_width="80dp"
            android:layout_height="match_parent">
            <ImageView
                android:id="@+id/info_image"
                android:layout_centerInParent="true"
                android:src="@drawable/girl"
                android:layout_width="60dp"
                android:layout_height="60dp"/>
        </RelativeLayout>
        <LinearLayout
            android:layout_width="0dp"
            android:layout_weight="1"
            android:background="#E1F5EC"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="2">
                <TextView
                    android:id="@+id/info_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginLeft="10dp"
                    android:text="大青儿"
                    android:textSize="25dp"
                    android:textColor="#333"/>
            </LinearLayout>
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1">
                <TextView
                    android:id="@+id/info_phone"
                    android:layout_gravity="center"
                    android:text="电话:13222240503"
                    android:layout_marginLeft="10dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
                <TextView
                    android:id="@+id/info_address"
                    android:layout_gravity="center"
                    android:text="地址:江苏苏州"
                    android:layout_marginLeft="10dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>
            </LinearLayout>

        </LinearLayout>
    </LinearLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="#666"/>

</LinearLayout>

总结

若是有什么问题或改进方案,请私信联系我或者在评论区留言
码字不易,如有帮助,给个关注和赞呗dom

在这里插入图片描述