You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:25:30