Android Studio Kotlin中RecyclerView点击跳转另一Activity问题求助
问题修复方案
核心问题点
- 接口回调没有绑定触发逻辑:你给ViewHolder实现了点击监听接口,但从未给itemView或卡片内按钮设置点击事件来触发这个接口,所以
onItemClick永远不会被调用 - 点击逻辑嵌套错误:你在
CurrentSch的onItemClick方法内部才给编辑按钮设置点击监听,相当于只有先触发回调才会给按钮加监听,逻辑完全倒置 - Adapter内编辑按钮点击判断错误:你在Adapter里给
pushimg设置的点击逻辑判断context是UpdateDataInfo类型,但当前context是CurrentSch,判断永远不成立,点击不会触发任何操作
修复代码
1. 修正EventAdapter代码
class EventAdapter(var mListener: onItemClickListener, var context: Context, val items: ArrayList<EventModelk>): RecyclerView.Adapter<EventAdapter.ViewHolder>() { interface onItemClickListener { // 直接把点击的条目数据传出去,不用只传位置 fun onEditClick(item: EventModelk) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val itemview = LayoutInflater.from(context).inflate( R.layout.eventitems, parent, false, ) return ViewHolder(itemview, mListener) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = items[position] holder.setEmail.text = item.eEmail holder.setNotes.text = item.nNotes holder.setData.text = item.dDate holder.setTime.text = item.tTime if (item.repeat == 1) { holder.setReap.isChecked = true } if (position % 2 == 0) { holder.main.setBackgroundColor( ContextCompat.getColor( context, R.color.colorLightGray ) ) } else { holder.main.setBackgroundColor(ContextCompat.getColor(context, R.color.colorWhite)) } // 直接在绑定的时候给编辑按钮设置点击,触发回调 holder.pushimg.setOnClickListener { mListener.onEditClick(item) } } override fun getItemCount(): Int { return items.size } class ViewHolder(view: View,onItemClickListener: onItemClickListener): RecyclerView.ViewHolder(view) { val main: CardView = view.IIMain val setData: TextView = view.set_date val setTime: TextView = view.set_time val setEmail: TextView = view.Tv_email val setNotes: TextView = view.set_note val setReap: CheckBox =view.is_repeat val pushimg: ImageView = view.img_edit } }
2. 修正CurrentSch代码
class CurrentSch : AppCompatActivity(), EventAdapter.onItemClickListener { var STORAGE_LOCAL =true lateinit var eventlist: ArrayList<EventModelk> @RequiresApi(Build.VERSION_CODES.N) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.currentsch) btnNewApp2.setOnClickListener { val intent = Intent(this, NewPlan::class.java) startActivity(intent) } seeAllEventInPlan() } private fun getEventist(): ArrayList<EventModelk>{ val eventdatabase = EventDatabasek(this) return eventdatabase.veiwEvent() } fun seeAllEventInPlan() { eventlist = getEventist() if(eventlist.size >0){ ryc_eventLists.visibility = View.VISIBLE viewnotview.visibility = View.GONE ryc_eventLists.layoutManager = LinearLayoutManager(this) val eventAdapter = EventAdapter(this,this, eventlist) ryc_eventLists.adapter = eventAdapter }else{ ryc_eventLists.visibility = View.GONE viewnotview.visibility = View.VISIBLE } } // 直接接收回调的条目数据,跳转Activity override fun onEditClick(item: EventModelk) { val intent = Intent(this, UpdateDataInfo::class.java) // 可以直接传序列化的对象,也可以传id/位置按需调整 intent.putExtra("event_data", item) startActivity(intent) } }
额外注意事项
- 如果你的
EventModelk没有实现序列化接口,需要给类加上@Serializable或者Parcelable注解才能直接通过Intent传递 - 如果需要传位置也可以调整接口参数,按需修改即可
内容的提问来源于stack exchange,提问作者WilliamB
相关产品推荐
相关产品推荐

