一、实验目的
深入学习Fragment的用法,自定义列表视图的实现。
二、实验要内容
实现一个班级名单的列表视图
每个列表项包含:个人照片,学号和姓名,电话;
可以删除列表项,添加列表项;
可以从列表项拨打对应的电话号码。
三、结构搭建
三、代码实现
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=".ListFragment"> <EditText android:id="@+id/edit_id" android:layout_width="wrap_content" android:layout_height="35dp" android:layout_marginStart="28dp" android:layout_marginTop="16dp" android:ems="10" android:hint="Please input id" 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="Please input name" 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="Please input phone" android:inputType="text" android:textSize="13sp" app:layout_constraintStart_toStartOf="@+id/edit_name" app:layout_constraintTop_toBottomOf="@+id/edit_name" /> <Button android:id="@+id/btn_commit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="84dp" android:layout_marginTop="52dp" android:text="submit" app:layout_constraintStart_toEndOf="@+id/edit_name" app:layout_constraintTop_toTopOf="parent" /> <ListView android:id="@+id/lv_stu" android:layout_width="match_parent" android:layout_height="592dp" android:layout_marginTop="36dp" 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="75dp"> <TextView android:id="@+id/tv_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="36dp" android:text="TextView" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toTopOf="@+id/imageView" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="TextView" app:layout_constraintStart_toStartOf="@+id/tv_id" app:layout_constraintTop_toBottomOf="@+id/tv_id" /> <ImageView android:id="@+id/imageView" android:layout_width="49dp" android:layout_height="48dp" android:layout_marginStart="16dp" android:layout_marginTop="12dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" android:src="@drawable/stu" /> <TextView android:id="@+id/tv_tel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="140dp" android:text="TextView" app:layout_constraintBottom_toBottomOf="@+id/imageView" app:layout_constraintStart_toEndOf="@+id/imageView" app:layout_constraintTop_toTopOf="@+id/imageView" /> <androidx.appcompat.widget.AppCompatImageButton android:id="@+id/btn_delete" android:layout_width="30dp" android:layout_height="30dp" android:layout_marginStart="324dp" android:layout_marginTop="18dp" android:text="删除" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@android:drawable/ic_menu_close_clear_cancel" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity
package com.suke.fragmentstudent; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import android.os.Bundle; 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 ListFragment(); fm.beginTransaction() .add(R.id.fragment_list, fragment) .commit(); } } }
ListFragment
package com.suke.fragmentstudent; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class ListFragment extends Fragment { private List<Student> list_stu = new ArrayList<>(); private StudentAdapter adapter; private EditText editId; private EditText editName; private EditText editTel; private Button btnCommit; private ListView lvStu; @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) { View view = inflater.inflate(R.layout.fragment_list, container, false); initView(view); initData(); return view; } private void initData() { for (int i = 1; i < 6; i++) { list_stu.add(new Student("1920013522" + i, "书启秋枫" + i, "1531214566" + i)); } adapter = new StudentAdapter(); lvStu.setAdapter(adapter); } private void initView(View view) { editId = (EditText) view.findViewById(R.id.edit_id); editName = (EditText) view.findViewById(R.id.edit_name); editTel = (EditText) view.findViewById(R.id.edit_tel); btnCommit = (Button) view.findViewById(R.id.btn_commit); lvStu = (ListView) view.findViewById(R.id.lv_stu); 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)); adapter.notifyDataSetChanged(); }); } private class StudentAdapter extends BaseAdapter { private TextView tvId; private TextView tvName; private ImageView imageView; private TextView tvTel; private ImageButton btnDelete; @Override public int getCount() { return list_stu.size(); } @Override public Object getItem(int position) { return list_stu.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_layout, parent, false); tvId = (TextView) convertView.findViewById(R.id.tv_id); tvName = (TextView) convertView.findViewById(R.id.tv_name); imageView = (ImageView) convertView.findViewById(R.id.imageView); tvTel = (TextView) convertView.findViewById(R.id.tv_tel); btnDelete = (ImageButton) convertView.findViewById(R.id.btn_delete); tvId.setText(list_stu.get(position).getSno()); tvName.setText(list_stu.get(position).getSname()); tvTel.setText(list_stu.get(position).getStele()); tvTel.setOnClickListener(v -> { String tel = list_stu.get(position).getStele(); Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + tel)); startActivity(intent); }); btnDelete.setOnClickListener(v -> { list_stu.remove(position); adapter.notifyDataSetChanged(); }); return convertView; } } }
Student
package com.suke.fragmentstudent; public class Student { private String Sno; private String Sname; private String Stele; public Student(String sno, String sname, String stele) { Sno = sno; Sname = sname; Stele = stele; } 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; } }
四、运行结果