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

如何通过RecyclerView项的OnClick事件根据位置打开详情页

实现RecyclerView列表项点击跳转详情页并传递数据

没问题!我给你整理了Java和Kotlin两种实现方案,一步步教你完成点击RecyclerView列表项跳转详情页并传递展示数据的功能:


Java 实现方案

1. 给RecyclerView Adapter添加点击监听

首先我们要在Adapter里定义一个点击回调接口,然后给每个列表项绑定点击事件,把位置和对应数据回调出去:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<DataModel> dataList;
    private OnItemClickListener listener;

    // 定义点击回调接口
    public interface OnItemClickListener {
        void onItemClick(int position, DataModel data);
    }

    // 构造方法传入数据和监听实例
    public MyAdapter(List<DataModel> dataList, OnItemClickListener listener) {
        this.dataList = dataList;
        this.listener = listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        DataModel data = dataList.get(position);
        // 这里把数据绑定到列表项的UI控件,比如 holder.titleTv.setText(data.getTitle());

        // 给列表项设置点击事件,触发回调
        holder.itemView.setOnClickListener(v -> {
            if (listener != null) {
                listener.onItemClick(position, data);
            }
        });
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    // ViewHolder类,用于缓存列表项的控件
    public static class ViewHolder extends RecyclerView.ViewHolder {
        // 声明列表项里的控件,比如 public TextView titleTv;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            // 初始化控件,比如 titleTv = itemView.findViewById(R.id.tv_title);
        }
    }
}

2. 在主Activity处理点击跳转

在主Activity里初始化RecyclerView,给Adapter设置点击监听,点击时通过Intent传递数据并启动详情Activity:

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private List<DataModel> dataList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        // 初始化你的数据列表
        dataList = new ArrayList<>();
        dataList.add(new DataModel("标题1", "这是第一条内容的详情"));
        dataList.add(new DataModel("标题2", "这是第二条内容的详情"));

        // 创建Adapter并设置点击监听
        MyAdapter adapter = new MyAdapter(dataList, (position, data) -> {
            // 构建Intent,传递数据
            Intent intent = new Intent(MainActivity.this, DetailActivity.class);
            // 单个字段传递
            intent.putExtra("DATA_TITLE", data.getTitle());
            intent.putExtra("DATA_CONTENT", data.getContent());
            // 如果数据模型复杂,推荐把DataModel实现Parcelable接口,直接传递对象:
            // intent.putExtra("DATA_MODEL", data);
            startActivity(intent);
        });
        recyclerView.setAdapter(adapter);
    }
}

3. 详情Activity接收并展示数据

在详情Activity里获取Intent传递的参数,然后设置到对应UI控件上:

public class DetailActivity extends AppCompatActivity {
    private TextView titleTv;
    private TextView contentTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        titleTv = findViewById(R.id.tv_detail_title);
        contentTv = findViewById(R.id.tv_detail_content);

        // 获取传递过来的数据
        Intent intent = getIntent();
        if (intent != null) {
            String title = intent.getStringExtra("DATA_TITLE");
            String content = intent.getStringExtra("DATA_CONTENT");
            // 如果是传递Parcelable对象:
            // DataModel data = intent.getParcelableExtra("DATA_MODEL");

            // 设置数据到UI
            titleTv.setText(title);
            contentTv.setText(content);
        }
    }
}

Kotlin 实现方案

Kotlin的写法会更简洁,用lambda替代接口回调,代码更清爽:

1. 实现带点击监听的RecyclerView Adapter

class MyAdapter(
    private val dataList: List<DataModel>,
    private val onItemClick: (Int, DataModel) -> Unit
) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {

    // 内部ViewHolder类
    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        // 声明并初始化列表项控件,比如 val titleTv: TextView = itemView.findViewById(R.id.tv_title)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val data = dataList[position]
        // 绑定数据到UI,比如 holder.titleTv.text = data.title

        // 设置点击事件,触发lambda回调
        holder.itemView.setOnClickListener {
            onItemClick(position, data)
        }
    }

    override fun getItemCount() = dataList.size
}

2. 主Activity处理跳转逻辑

class MainActivity : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView
    private lateinit var dataList: List<DataModel>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)

        // 初始化数据列表
        dataList = listOf(
            DataModel("标题1", "这是第一条内容的详情"),
            DataModel("标题2", "这是第二条内容的详情")
        )

        // 创建Adapter并设置点击回调
        val adapter = MyAdapter(dataList) { position, data ->
            // 构建Intent并传递数据
            val intent = Intent(this, DetailActivity::class.java).apply {
                putExtra("DATA_TITLE", data.title)
                putExtra("DATA_CONTENT", data.content)
                // 复杂模型用Parcelable传递:
                // putExtra("DATA_MODEL", data)
            }
            startActivity(intent)
        }
        recyclerView.adapter = adapter
    }
}

3. 详情Activity接收并展示数据

class DetailActivity : AppCompatActivity() {
    private lateinit var titleTv: TextView
    private lateinit var contentTv: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_detail)

        titleTv = findViewById(R.id.tv_detail_title)
        contentTv = findViewById(R.id.tv_detail_content)

        // 安全获取Intent数据
        intent?.let {
            val title = it.getStringExtra("DATA_TITLE")
            val content = it.getStringExtra("DATA_CONTENT")
            // Parcelable对象获取:
            // val data = it.getParcelableExtra<DataModel>("DATA_MODEL")

            titleTv.text = title
            contentTv.text = content
        }
    }
}

小提示:如果你的数据模型字段比较多,推荐让DataModel实现Parcelable接口(Java手动实现,Kotlin可以用@Parcelize注解,记得在gradle里开启相关配置),这样可以直接传递整个对象,不用一个个字段传,更高效也更易维护。

内容的提问来源于stack exchange,提问作者Abdulrahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:48