一、实验目的
深入学习Fragment的用法,自定义列表(RecyclerView)视图的实现。
二、实验内容
实现一个班级名单的列表视图
每个列表项包含:个人照片,学号和姓名,电话;
可以删除列表项,添加列表项;
可以从列表项拨打对应的电话号码。
三、结构搭建
四、代码实现
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/fragment_list" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_listxml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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=".FragmentList"> <EditText android:id="@+id/edit_id" android:layout_width="wrap_content" android:layout_height="35dp" android:layout_marginStart="60dp" android:layout_marginTop="16dp" android:ems="10" android:hint="请输入学号" android:inputType="text" android:textSize="13sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/edit_name" android:layout_width="wrap_content" android:layout_height="35dp" android:layout_marginTop="8dp" android:ems="10" android:hint="请输入姓名" android:inputType="text" android:textSize="13sp" app:layout_constraintStart_toStartOf="@+id/edit_id" app:layout_constraintTop_toBottomOf="@+id/edit_id" /> <EditText android:id="@+id/edit_tel" android:layout_width="wrap_content" android:layout_height="35dp" android:layout_marginTop="8dp" android:ems="10" android:hint="请输入手机号" android:inputType="text" android:textSize="13sp" app:layout_constraintStart_toStartOf="@+id/edit_name" app:layout_constraintTop_toBottomOf="@+id/edit_name" /> <ImageView android:id="@+id/image_stu" android:layout_width="84dp" android:layout_height="65dp" android:layout_marginTop="16dp" android:layout_marginEnd="60dp" android:src="@drawable/ls" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toEndOf="@+id/edit_name" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/btn_commit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:text="添加" app:layout_constraintStart_toStartOf="@+id/image_stu" app:layout_constraintTop_toBottomOf="@+id/image_stu" /> <androidx.appcompat.widget.AppCompatImageButton android:id="@+id/btn_id" android:layout_width="35dp" android:layout_height="35dp" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:adjustViewBounds="true" android:background="@android:drawable/btn_star_big_on" android:scaleType="fitXY" android:text="学号" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.appcompat.widget.AppCompatImageButton android:id="@+id/btn_name" android:layout_width="35dp" android:layout_height="35dp" android:layout_marginTop="60dp" android:adjustViewBounds="true" android:background="@drawable/stu" android:scaleType="fitXY" android:text="姓名" app:layout_constraintStart_toStartOf="@+id/btn_id" app:layout_constraintTop_toTopOf="parent" /> <androidx.appcompat.widget.AppCompatImageButton android:id="@+id/btn_phone" android:layout_width="35dp" android:layout_height="35dp" android:layout_marginTop="100dp" android:adjustViewBounds="true" android:background="@android:drawable/sym_action_call" android:scaleType="fitXY" android:text="手机号" app:layout_constraintStart_toStartOf="@+id/btn_name" app:layout_constraintTop_toTopOf="parent" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rcv_stu" android:layout_width="match_parent" android:layout_height="592dp" android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/btn_commit" tools:layout_editor_absoluteX="0dp" /> </androidx.constraintlayout.widget.ConstraintLayout>
list_item_layout.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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="90dp"> <ImageView android:id="@+id/imageView" android:layout_width="86dp" android:layout_height="66dp" android:layout_marginStart="28dp" android:layout_marginTop="12dp" android:src="@drawable/ls" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/tv_id" android:layout_width="96dp" android:layout_height="21dp" android:layout_marginStart="40dp" android:text="学号" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toTopOf="@+id/imageView" tools:ignore="MissingConstraints" /> <TextView android:id="@+id/tv_name" android:layout_width="96dp" android:layout_height="20dp" android:text="姓名" app:layout_constraintBottom_toTopOf="@+id/tv_tel" app:layout_constraintEnd_toEndOf="@+id/tv_id" app:layout_constraintStart_toStartOf="@+id/tv_id" app:layout_constraintTop_toBottomOf="@+id/tv_id" tools:ignore="MissingConstraints" /> <TextView android:id="@+id/tv_tel" android:layout_width="96dp" android:layout_height="20dp" android:text="手机号" app:layout_constraintBottom_toBottomOf="@+id/imageView" app:layout_constraintEnd_toEndOf="@+id/tv_name" app:layout_constraintStart_toStartOf="@+id/tv_name" /> <androidx.appcompat.widget.AppCompatImageButton android:id="@+id/btn_delete" android:layout_width="56dp" android:layout_height="46dp" android:layout_marginStart="176dp" android:text="删除" app:layout_constraintBottom_toBottomOf="@+id/tv_tel" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.184" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toTopOf="@+id/tv_id" app:srcCompat="@android:drawable/btn_dialog" /> </androidx.constraintlayout.widget.ConstraintLayout>
FragmentList
package com.suke.recyclerstudent; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; import java.util.Random; public class FragmentList extends Fragment { //控制台打印提示 private final String TagCreate = "create"; private final String TagDelete = "delete"; //创建学生信息列表 private List<Student> list_stu = new ArrayList<>(); //学号、姓名、手机号 private EditText editId; private EditText editName; private EditText editTel; private ImageView imageView; //添加学生信息按钮 private Button btnCommit; private StudentAdapter studentAdapter; //学生信息视图列表 private RecyclerView rcvStu; String[] ids = new String[]{"19200135221", "19200135222", "19200135223", "19200135224", "19200135225", "19200135226"}; String[] names = new String[]{"书启秋枫", "Gaze", "无羡", "阿斌", "家和万事兴", "石业大帝"}; String[] tels = new String[]{"15312133001", "153121330012", "153121330013", "153121330014", "153121330015", "153121330016"}; int[] images = new int[]{R.drawable.ls, R.drawable.cc, R.drawable.mr, R.drawable.zb, R.drawable.zjh, R.drawable.lishuo}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //1.获取fragment_list视图 View view = inflater.inflate(R.layout.fragment_list, container, false); //2.初始化视图 initView(view); //3.初始化数据 initData(); //4.返回视图 return view; } //2.初始化视图 private void initView(View view) { editId = view.findViewById(R.id.edit_id); editName = view.findViewById(R.id.edit_name); editTel = view.findViewById(R.id.edit_tel); btnCommit = view.findViewById(R.id.btn_commit); rcvStu = view.findViewById(R.id.rcv_stu); imageView = view.findViewById(R.id.image_stu); //设置 recyclerview 显示布局 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()); rcvStu.setLayoutManager(linearLayoutManager); //选择随机头像 final int[] random = {0}; imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { random[0] = new Random().nextInt(6); imageView.setImageResource(images[random[0]]); } }); //添加学生信息(lambda表达式) btnCommit.setOnClickListener(v -> { String id = editId.getText().toString(); String name = editName.getText().toString(); String tel = editTel.getText().toString(); editId.setText(""); editName.setText(""); editTel.setText(""); list_stu.add(new Student(id, name, tel, random[0])); Log.e(TagCreate, "学生创建成功"); studentAdapter.notifyDataSetChanged(); }); } //3.初始化数据 private void initData() { for (int i = 0; i < 6; i++) { Student student = new Student(ids[i], names[i], tels[i], i); list_stu.add(student); studentAdapter = new StudentAdapter(); rcvStu.setAdapter(studentAdapter); } } private class StudentAdapter extends RecyclerView.Adapter<StudentAdapter.MyViewHolder> { @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = View.inflate(getContext(), R.layout.list_item_layout, null); return new MyViewHolder(view); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { holder.tvId.setText(list_stu.get(position).getSno()); holder.tvName.setText(list_stu.get(position).getSname()); holder.tvTel.setText(list_stu.get(position).getStele()); holder.imageView.setImageResource(images[list_stu.get(position).getImageId()]); //拨打电话(隐式调用) holder.tvTel.setOnClickListener(v -> { String tel = list_stu.get(position).getStele(); //传入两个参数(一个是拨号盘,一个是电话号) Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + tel)); //实例化之后startActivity执行 startActivity(intent); }); //切换随机头像 holder.imageView.setOnClickListener(v -> { Random random = new Random(); holder.imageView.setImageResource(images[random.nextInt(6)]); }); //删除学生信息 holder.btnDelete.setOnClickListener(v -> { list_stu.remove(position); studentAdapter.notifyDataSetChanged(); Log.e(TagDelete, "学生已删除"); }); } //RecyclerView视图列表展示数量 @Override public int getItemCount() { //判断是否为空 return list_stu == null ? 0 : list_stu.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { //学号、姓名、手机号 private TextView tvId; private TextView tvName; private TextView tvTel; //学生头像 private ImageView imageView; //删除学生 private ImageButton btnDelete; public MyViewHolder(@NonNull View itemView) { super(itemView); tvId = itemView.findViewById(R.id.tv_id); tvName = itemView.findViewById(R.id.tv_name); tvTel = itemView.findViewById(R.id.tv_tel); imageView = itemView.findViewById(R.id.imageView); btnDelete = itemView.findViewById(R.id.btn_delete); } } } }
MainActivity
package com.suke.recyclerstudent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragment_list); if (fragment == null) { fragment = new FragmentList(); fm.beginTransaction() .add(R.id.fragment_list, fragment) .commit(); } } }
Student
package com.suke.recyclerstudent; public class Student { private String Sno; private String Sname; private String Stele; private int imageId; public Student(String sno, String sname, String stele, int imageId) { Sno = sno; Sname = sname; Stele = stele; this.imageId = imageId; } public String getSno() { return Sno; } public void setSno(String sno) { Sno = sno; } public String getSname() { return Sname; } public void setSname(String sname) { Sname = sname; } public String getStele() { return Stele; } public void setStele(String stele) { Stele = stele; } public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } }
五、运行结果