Kotlin Android开发中如何在自定义Adapter中访问Intent传递的数组
问题原因&修复方案
你的代码存在以下几个核心问题,修改后即可正常渲染列表:
- 下标取值错误:
getView方法中你用数组长度sizeOfCart!!作为下标读取元素,而安卓列表的下标范围是0 到 数组长度-1,该写法会直接触发数组越界异常,应该使用方法传入的position参数作为下标。 - 数据传递逻辑不规范:虽然内部类可以访问外部Activity的Intent,但更稳妥的做法是在Activity层先取出购物车数据,再传入Adapter,避免空指针风险。
- 空断言滥用:
!!会在变量为空时直接触发崩溃,需要补充空兼容逻辑。 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
相关产品推荐
相关产品推荐

