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

Kotlin Android开发中如何在自定义Adapter中访问Intent传递的数组

问题原因&修复方案

你的代码存在以下几个核心问题,修改后即可正常渲染列表:

  1. 下标取值错误:getView方法中你用数组长度sizeOfCart!!作为下标读取元素,而安卓列表的下标范围是0 到 数组长度-1,该写法会直接触发数组越界异常,应该使用方法传入的position参数作为下标。
  2. 数据传递逻辑不规范:虽然内部类可以访问外部Activity的Intent,但更稳妥的做法是在Activity层先取出购物车数据,再传入Adapter,避免空指针风险。
  3. 空断言滥用:!!会在变量为空时直接触发崩溃,需要补充空兼容逻辑。
  4. getItem方法逻辑错误:当前返回固定字符串,应该返回对应位置的购物车数据。

修正后完整代码

import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ListView
import android.widget.TextView

class Cart : AppCompatActivity() {

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

        // 先在Activity层取出购物车数据,为空时给默认空列表避免空指针
        val listOfCartItems = intent.getStringArrayListExtra("CuriseCart") ?: emptyList()
        val listview = findViewById<ListView>(R.id.CartItems)
        // 将购物车数据传入Adapter
        listview.adapter = MyCustomAdapter(this, listOfCartItems)
    }

    // 构造方法新增购物车数组参数
    private inner class MyCustomAdapter(context: Context, private val listOfCartItems: List<String>): BaseAdapter(){
        private val mContext: Context = context

        override fun getCount(): Int {
            // 直接返回数组长度,无需空判断
            return listOfCartItems.size
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getItem(position: Int): Any {
            // 返回对应位置的商品数据
            return listOfCartItems[position]
        }

        override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup?): View {
            val layoutInflater = LayoutInflater.from(mContext)
            val rowFormat = layoutInflater.inflate(R.layout.listview_custom, viewGroup, false)

            println("Cart Items"+listOfCartItems)
            println("Size of Cart"+listOfCartItems.size)

            val cruiseTitle = rowFormat.findViewById<TextView>(R.id.cruiseTitle)
            // 用position作为下标取对应位置的商品名
            cruiseTitle.text = listOfCartItems[position]

            // 后续durationLabel、numOfTravelers、costOfCruise如果是数组里的拆分数据,按相同规则取对应字段渲染即可
            val durationLabel = rowFormat.findViewById<TextView>(R.id.durationLabel)
            val numOfTravelers = rowFormat.findViewById<TextView>(R.id.numOfTravelers)
            val costOfCruise = rowFormat.findViewById<TextView>(R.id.costOfCruise)

            return rowFormat
        }
    }
}

补充说明

如果你的购物车数据不止标题,还包含时长、人数、价格等字段,建议不要用String数组存储,自定义一个CartItem数据类存储所有字段,传递和渲染会更方便。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:15:01