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

如何在Kotlin中通过嵌套JSON实现点击RecyclerView条目跳转至另一Activity并加载对应子RecyclerView

解决点击作物条目后展示对应肥料列表的问题

看了你的代码,现在的核心问题是CropDetailsActivity启动后重新请求了全部数据集,而不是直接复用你点击的那个作物对应的cropFertilizer列表。咱们可以通过直接传递目标数据的方式解决,不用重复发起网络请求,具体步骤如下:

1. 让数据类支持跨Activity传递

要在Activity之间传递自定义数据列表,需要让CropFertilizer和CropData实现Parcelable接口。Kotlin提供了@Parcelize注解,可以自动生成Parcelable的实现代码,非常方便:

首先确保你的app模块build.gradle(或build.gradle.kts)开启了kotlin-parcelize插件:

plugins {
    // 保留你已有的其他插件
    id 'kotlin-parcelize'
}

然后修改两个数据类:

// CropFertilizer.kt
import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class CropFertilizer(
    @SerializedName("fertilizerName") val fertilizerName: String,
    @SerializedName("fertilizerFirst") val fertilizerFirst: String,
    @SerializedName("fertilizerSecond") val fertilizerSecond: String,
    @SerializedName("fertilizerThird") val fertilizerThird: String
) : Parcelable

// CropData.kt
import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class CropData(
    @SerializedName("cropImage") val cropImage: String,
    @SerializedName("cropName") val cropName: String,
    @SerializedName("cropTime") val cropTime: String,
    @SerializedName("cropDetails") val cropDetails: String,
    @SerializedName("cropProcess") val cropProcess: String,
    @SerializedName("cropType") val cropType: String,
    @SerializedName("cropFertilizer") val cropFertilizer: List<CropFertilizer>
) : Parcelable

2. 修改跳转逻辑,传递目标肥料列表

在CropActivity的onClick方法里,直接把点击条目对应的cropFertilizer列表放到Intent中:

override fun onClick(item: CropData, position: Int) {
    val intent = Intent(this, CropDetailsActivity::class.java)
    intent.putExtra("name", item.cropName)
    intent.putExtra("image", item.cropImage)
    intent.putExtra("intro", item.cropDetails)
    intent.putExtra("process", item.cropProcess)
    intent.putExtra("type", item.cropType)
    intent.putExtra("time", item.cropTime)
    // 新增:传递当前作物的肥料列表
    intent.putParcelableArrayListExtra("fertilizer_list", ArrayList(item.cropFertilizer))
    startActivity(intent)
}

3. 重构CropDetailsActivity,直接使用传递的列表

现在不需要再请求接口了,直接从Intent中取出肥料列表设置给Adapter,同时清理掉多余的ViewModel相关代码:

class CropDetailsActivity : AppCompatActivity() {
    private val fertilizerAdapter by lazy { FertilizerAdapter() }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_crop_details)
        val bundle: Bundle? = intent.extras
        
        bundle?.let {
            // 初始化作物基本信息
            crop_details_name.text = it.getString("name")
            crop_details_intro.text = it.getString("intro")
            Glide.with(this).load(it.getString("image")).into(crop_details_image)
            crop_details_process.text = it.getString("process")
            crop_details_time.text = it.getString("time")
            crop_details_type.text = it.getString("type")
            
            // 获取并设置肥料列表
            val fertilizerList = it.getParcelableArrayList<CropFertilizer>("fertilizer_list")
            fertilizerList?.let { list ->
                fertilizerAdapter.setData(list)
            }
        }
        
        // 初始化RecyclerView
        crop_details_recyclerview.layoutManager = LinearLayoutManager(
            this,
            LinearLayoutManager.VERTICAL,
            false
        )
        crop_details_recyclerview.setHasFixedSize(true)
        crop_details_recyclerview.adapter = fertilizerAdapter
    }
}

4. 确认FertilizerAdapter的setData方法逻辑正确

确保你的FertilizerAdapter的setData方法能正确更新数据:

class FertilizerAdapter : RecyclerView.Adapter<FertilizerAdapter.ViewHolder>() {
    private var fertilizerList = emptyList<CropFertilizer>()

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = fertilizerList[position]
        holder.itemView.fertilizer_name.text = item.fertilizerName
        // 根据你的布局绑定其他肥料字段,比如fertilizerFirst等
    }

    override fun getItemCount(): Int = fertilizerList.size

    fun setData(newList: List<CropFertilizer>) {
        fertilizerList = newList
        notifyDataSetChanged()
    }

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
}

这样修改后,点击CropActivity里的任意作物条目,对应的肥料列表会直接传递到CropDetailsActivity并展示,既避免了冗余的网络请求,又能精准匹配目标数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:17:45