本篇使用Sqlite+RecyclerView+Dialog对数据进行增删改查 同时这也是中国大学慕课移动终端应用开发的网课作业21 原题目要求: 1.此篇博文是代码部分,一些有关于实现的细节,感兴趣的同学可以看一下此篇博文 这是我的目录结构,adapter包下是适配器,dao包下是访问数据库的接口和实现方法,database包下是一些有关数据库的类,dialog包下是自定义对话框,model包下是数据模型 由于使用了RecyclerView,所以得添加依赖 如果有什么问题或改进方案,请私信联系我或者在评论区留言
(1)通过“添加联系人”按钮,跳转到“添加”信息的Dialog输入用户名、联系电话、地址选择性别,添加后显示到联系人列表。
(2)点击 联系人中的项,可以弹出Dialog,修改联系人信息或者删除联系人。
(3)可以通过输入姓名进行联系人信息的查找,并给出信息。说明
2.建议阅读《安卓编程权威指南3》,里面有关Sqlite的代码的格式值得学习,或者说,整本书的代码风格都是值得学习的
3.我会持续更新我的作业,关注不迷路哈效果图
代码
目录结构
添加依赖
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="https://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="https://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="https://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="https://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>
总结
码字不易,若有帮助,给个关注和赞呗
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算