如何在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
相关产品推荐
相关产品推荐

