如何在RecyclerView适配器生命周期中用Context初始化SharedPreferences相关变量?
RecyclerView适配器中初始化genrePreferences的合适时机
最合适的初始化位置是适配器的构造函数,或者在onCreateViewHolder首次执行时完成初始化,其中构造函数的方式更稳妥可靠。
为什么选构造函数?
构造函数是适配器实例化时第一个执行的逻辑块,能保证genrePreferences在任何需要它的方法(比如onBindViewHolder)调用前就完成初始化,彻底避免lateinit变量未初始化导致的运行时异常。
修改示例(构造函数传Context)
直接在构造函数中接收Context,同步初始化genrePreferences:
class MovieAdapter( private val movieList: ArrayList<Movie>, private val context: Context ) : RecyclerView.Adapter<MovieAdapter.MovieViewHolder>() { private val BASE_POSTER_PATH = "https://image.tmdb.org/t/p/w342" private val genrePreferences: GenrePreferences = GenrePreferences(context) private val genres: HashMap<Int, String> = genrePreferences.getGenres() // 假设你有获取 genres 的方法 class MovieViewHolder(var view: ItemMovieTvshowBinding, val context: Context) : RecyclerView.ViewHolder(view.root) { } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder { val inflater = LayoutInflater.from(parent.context) val view = DataBindingUtil.inflate<ItemMovieTvshowBinding>( inflater, R.layout.item_movie_tvshow, parent, false ) return MovieViewHolder(view, parent.context) } override fun onBindViewHolder(holder: MovieViewHolder, position: Int) { // 这里可以放心使用 genrePreferences 和 genres } override fun getItemCount(): Int { return movieList.size } }
备选方案(不修改构造函数)
如果不想调整构造函数参数,也可以在onCreateViewHolder中做一次性初始化,注意要判断变量是否已初始化,避免重复操作:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder { val inflater = LayoutInflater.from(parent.context) // 仅在首次创建ViewHolder时初始化 if (!::genrePreferences.isInitialized) { genrePreferences = GenrePreferences(parent.context) genres = genrePreferences.getGenres() } val view = DataBindingUtil.inflate<ItemMovieTvshowBinding>( inflater, R.layout.item_movie_tvshow, parent, false ) return MovieViewHolder(view, parent.context) }
两种方式对比
- 构造函数传Context:逻辑清晰,初始化时机明确,无重复初始化风险,是优先推荐的方案。
onCreateViewHolder初始化:适合无法修改构造函数的场景,但需要额外的初始化判断,稍显繁琐。
内容的提问来源于stack exchange,提问作者İbrahim Uyar
相关产品推荐
相关产品推荐

