如何为RecyclerView设置onClick监听器,实现数据回传至表单页面?
实现RecyclerView的Item点击事件并回传数据至表单Activity
1. 在Adapter中定义点击监听接口
修改EmployeeRecycler.java,添加点击回调接口,绑定Item点击事件:
package com.example.roomdatabaseandroid; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.roomdatabaseandroid.DataModel.DataConverter; import com.example.roomdatabaseandroid.DataModel.Employee; import java.util.List; public class EmployeeRecycler extends RecyclerView.Adapter<EmployeeViewHolder> { List<Employee> data; private OnItemClickListener listener; // 定义Item点击回调接口 public interface OnItemClickListener { void onItemClick(Employee employee); } // 构造函数传入数据集和监听实例 public EmployeeRecycler(List<Employee> employees, OnItemClickListener listener){ data = employees; this.listener = listener; } @NonNull @Override public EmployeeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.list_item_1, parent,false ); return new EmployeeViewHolder(view); } @Override public void onBindViewHolder(@NonNull EmployeeViewHolder holder, int position) { Employee employee = data.get(position); holder.imageView.setImageBitmap(DataConverter.convertByteArraytoImage(employee.getImage())); holder.firstName.setText(employee.getFirstName()); holder.middleName.setText(employee.getMiddleName()); holder.lastName.setText(employee.getLastName()); holder.dob.setText(employee.getDOB()); holder.gender.setText(employee.getGender()); holder.address.setText(employee.getAddress()); holder.designation.setText(employee.getDesignation()); holder.email.setText(employee.getEmail()); holder.phoneNumber.setText(employee.getPhoneNumber()); // 绑定Item点击事件,触发回调 holder.itemView.setOnClickListener(v -> { if (listener != null) { listener.onItemClick(employee); } }); } @Override public int getItemCount() { return data.size(); } // 提供数据更新方法,用于修改后刷新列表 public void updateData(List<Employee> newData) { data = newData; notifyDataSetChanged(); } }
2. 在ShowEmployees中实现点击监听并跳转至表单Activity
修改ShowEmployees.java,实现点击回调逻辑,携带数据跳转,并处理返回结果刷新列表:
package com.example.roomdatabaseandroid; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Toast; import com.example.roomdatabaseandroid.DataModel.Employee; import com.example.roomdatabaseandroid.DataModel.EmployeeDao; import com.example.roomdatabaseandroid.DataModel.EmployeeDatabase; import com.google.android.material.floatingactionbutton.FloatingActionButton; public class ShowEmployees extends AppCompatActivity { private static final int EDIT_EMPLOYEE_REQUEST = 2; private EmployeeDao employeeDao; private EmployeeRecycler employeeRecycler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_show_employees); RecyclerView recyclerView; FloatingActionButton fab = findViewById(R.id.idFABAdd); fab.setOnClickListener(v -> { Intent intent = new Intent(ShowEmployees.this, MainActivity.class); startActivity(intent); }); employeeDao = EmployeeDatabase.getDBInstance(this).employeeDao(); recyclerView = findViewById(R.id.employeeRecyclerView); // 创建Adapter时传入点击监听,处理跳转逻辑 employeeRecycler = new EmployeeRecycler(employeeDao.getAllEmployee(), employee -> { Intent intent = new Intent(ShowEmployees.this, MainActivity.class); // 传递Employee数据,需确保Employee类实现Serializable接口 intent.putExtra("EDIT_EMPLOYEE", employee); startActivityForResult(intent, EDIT_EMPLOYEE_REQUEST); }); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(employeeRecycler); new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) { @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { employeeDao.deleteEmployee(employeeRecycler.data.get(viewHolder.getAdapterPosition())); Toast.makeText(ShowEmployees.this, "Employee deleted", Toast.LENGTH_SHORT).show(); employeeRecycler.updateData(employeeDao.getAllEmployee()); } }).attachToRecyclerView(recyclerView); } // 处理表单Activity返回的结果,刷新列表 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == EDIT_EMPLOYEE_REQUEST && resultCode == RESULT_OK) { employeeRecycler.updateData(employeeDao.getAllEmployee()); Toast.makeText(this, "Employee updated", Toast.LENGTH_SHORT).show(); } } }
3. 让Employee类支持Intent传递
在Employee实体类中实现Serializable接口,确保数据能通过Intent传递:
import java.io.Serializable; public class Employee implements Serializable { // 原有字段、构造函数、getter/setter private int id; private String firstName; private String middleName; // ...其他字段 }
4. 在MainActivity中接收并处理编辑请求
修改MainActivity.java,接收传递的Employee数据填充表单,修改后更新数据库并返回结果:
import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import com.example.roomdatabaseandroid.DataModel.Employee; import com.example.roomdatabaseandroid.DataModel.EmployeeDao; import com.example.roomdatabaseandroid.DataModel.EmployeeDatabase; public class MainActivity extends AppCompatActivity { private EmployeeDao employeeDao; private Employee currentEmployee; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); employeeDao = EmployeeDatabase.getDBInstance(this).employeeDao(); // 检查是否为编辑请求,填充表单 Intent intent = getIntent(); if (intent != null && intent.hasExtra("EDIT_EMPLOYEE")) { currentEmployee = (Employee) intent.getSerializableExtra("EDIT_EMPLOYEE"); // 示例:填充输入框 // editTextFirstName.setText(currentEmployee.getFirstName()); // editTextLastName.setText(currentEmployee.getLastName()); // ...填充其他字段 } // 保存按钮点击事件 findViewById(R.id.idBtnSave).setOnClickListener(v -> { if (currentEmployee != null) { // 更新现有员工数据 currentEmployee.setFirstName(/* 获取输入框内容 */); currentEmployee.setLastName(/* 获取输入框内容 */); // ...更新其他字段 employeeDao.updateEmployee(currentEmployee); setResult(RESULT_OK); finish(); } else { // 添加新员工的原有逻辑 Employee newEmployee = new Employee(); // ...设置字段 employeeDao.insertEmployee(newEmployee); finish(); } }); } }
内容的提问来源于stack exchange,提问作者Nishil Raiyarela
相关产品推荐
相关产品推荐

