Fragment中编辑ListView对象:如何从Bundle获取Student实例实现编辑功能
解决方案
一、先修正现有代码的基础错误
你的代码里存在几处命名、参数不匹配的问题,先调整避免运行报错:
- 实体类命名统一:将你现在的
City类名改为Student,和后续逻辑的类名对齐 - 修正实体类构造函数:构造函数中
this.Sname=name;改为this.Sname = Sname;,不存在name参数 - 修正国籍setter方法:
public void nationality(String nationality)改为public void setNationality(String nationality) - 修正Fragment中变量拼写:
private EditText nationlaity;改为private EditText nationality; - 修正回调接口参数:
void onOkPressed(City newCity);改为void onOkPressed(Student student);
二、从Bundle中取出Student对象并实现编辑逻辑
修改AddStudentFragment的onCreateDialog方法,新增判断是否有传入的Student对象,区分新增/编辑模式:
@NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { //Inflate the layout for this fragment View view= LayoutInflater.from(getActivity()).inflate(R.layout.add_city_fragment_layout,null); sName=view.findViewById(R.id.student_name_editText); nationality=view.findViewById(R.id.nationality_editText); AlertDialog.Builder builder=new AlertDialog.Builder(getContext()); // 新增:从Bundle取出Student对象,区分模式 Bundle args = getArguments(); Student editStudent = null; if (args != null && args.containsKey("student")) { editStudent = (Student) args.getSerializable("student"); // 编辑模式:填充原有数据到输入框,修改弹窗标题 sName.setText(editStudent.getSname()); nationality.setText(editStudent.getNationality()); builder.setTitle("编辑学生信息"); } else { builder.setTitle("添加学生"); } final Student finalEditStudent = editStudent; return builder .setView(view) .setNegativeButton("Cancel",null) .setPositiveButton("OK",new DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialogInterface,int i){ String newName=sName.getText().toString(); String newNationality=nationality.getText().toString(); if (finalEditStudent != null) { // 编辑模式:修改原有对象的属性 finalEditStudent.setName(newName); finalEditStudent.setNationality(newNationality); listener.onOkPressed(finalEditStudent); } else { // 新增模式:创建新对象 listener.onOkPressed(new Student(newName,newNationality)); } } }).create(); }
三、Activity端适配逻辑
- 新增场景:点击添加按钮时,调用
AddStudentFragment.newInstance(null)弹出弹窗,回调方法中把返回的Student对象添加到列表数据源,调用Adapter的notifyDataSetChanged()刷新列表 - 编辑场景:给ListView设置
OnItemClickListener,点击条目时记录选中的Student对象/对应下标,调用AddStudentFragment.newInstance(选中的Student对象)弹出弹窗,回调方法中更新对应下标的数据源,刷新列表即可
内容的提问来源于stack exchange,提问作者Julian Schmitt
相关产品推荐
相关产品推荐

