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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:45:29