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

如何将MainActivity中的master变量传递到ListAdapter中使用

可行实现方案

这里给你最直接且安全的构造函数传参方案,无需依赖Bundle,全程无内存泄漏风险,修改步骤如下:

步骤1:修改ListAdapter新增构造参数

给ListAdapter添加私有master字符串构造参数,直接在类声明处修改即可,修改后代码如下:

class ListAdapter(private val master: String): RecyclerView.Adapter<ListAdapter.MyViewHolder>() {

    private var userList = emptyList<User>()

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

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        return MyViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.custom_row, parent, false))
    }

    override fun getItemCount(): Int {
       return userList.size
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem = userList[position]
        holder.itemView.id_txt.text = currentItem.id.toString()
        holder.itemView.firstName_txt.text = currentItem.firstName
        // 这里直接用构造传入的master即可
        val encryptKey = master + currentItem.salt
        holder.itemView.lastName_txt.text = encrypt(currentItem.lastName, encryptKey)
        holder.itemView.salt_txt.text = currentItem.salt
    }

    fun setData(user: List<User>){
        this.userList = user
        notifyDataSetChanged()
    }
    // 如果后续master会变动,可以加这个方法动态更新
    fun updateMaster(newMaster: String) {
        this.master = newMaster
        notifyDataSetChanged()
    }
}

步骤2:在ListFragment中获取MainActivity的master变量,初始化Adapter时传入

因为ListFragment依附于MainActivity,直接通过requireActivity强转即可拿到MainActivity实例的master变量,修改ListFragment的onCreateView中Adapter初始化部分:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_list, container, false)

    // 从依附的MainActivity获取master变量
    val mainActivity = requireActivity() as MainActivity
    val master = mainActivity.master

    // 初始化Adapter时传入master
    val adapter = ListAdapter(master)
    val recyclerView = view.recyclerview
    recyclerView.adapter = adapter
    recyclerView.layoutManager = LinearLayoutManager(requireContext())

    // UserViewModel
    mUserViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
    mUserViewModel.readAllData.observe(viewLifecycleOwner, Observer { user ->
        adapter.setData(user)
    })

    view.floatingActionButton.setOnClickListener {
        findNavController().navigate(R.id.action_listFragment_to_addFragment)
    }

    return view
}

注意事项

  • 你现有逻辑中只有createMaster和checklogin验证通过后才会加载包含ListFragment的主布局,所以初始化Adapter时master已经完成赋值,不会出现空值或者默认值问题
  • 不要把明文master持久化存储到SharedPreferences等本地存储中,避免敏感信息泄露,当前内存传递的方案更安全

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:09:02