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

