要在回收器视图适配器中使用的正确上下文



当我在RecyclerView适配器中使用SharedPreference时,我应该使用哪个context?这令人困惑,因为在默认期间,contextinval mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)显示为未解析的引用。

class MyRVAdapter(private val myString: ArrayList<String>): RecyclerView.Adapter<MyRVAdapter.MyViewHolder>() {
private val typeA = 1
private val typeB = 2
override fun onCreateViewHolder(parent: ViewGroup, type: Int): MyViewHolder {
return when (type) {
typeA -> MyViewHolder(inflateHelper(R.layout.rv_type_a, parent))
typeB -> MyViewHolder(inflateHelper(R.layout.rv_type_b, parent))
else -> MyViewHolder(inflateHelper(R.layout.rv_type_a, parent))
}
}
override fun onBindViewHolder(viewHolder: MyViewHolder, position: Int) {
if (getItemViewType(position) == typeA) {
// Check preference (what's the correct context?)
val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
valueDestinationExpanded = mSharedPreferences.getBoolean("my_preference", true)
}
else if (getItemViewType(position) == typeB) {
}
}
private fun inflateHelper(resId: Int, parent: ViewGroup): View {
return LayoutInflater.from(parent.context).inflate(resId, parent, false)
}
override fun getItemViewType(position: Int): Int {
return if (position == 0) typeA
else typeB
}
}

在片段中

我的电视不能为空

class MyFragment : androidx.fragment.app.Fragment() {
private lateinit var mRecyclerView: RecyclerView
private var valueShowTextView: Boolean = false
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.my_rv, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
val v = view
val myTV = my_tv
mRecyclerView = v.mRecyclerViewSansToolbar
mRecyclerView.layoutManager = LinearLayoutManager(activity)
val mAdapter = MyRVAdapter(dataTVtext!!)
val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
valueDestinationExpanded = mSharedPreferences.getBoolean("preference_DestinationExpand", true)
if (valueShowTextView) {
myTV.visibility = View.VISIBLE
} else {
myTV.visibility = View.GONE
}
mRecyclerView.adapter = mAdapter
super.onActivityCreated(savedInstanceState)
}
}

任何Context都可以。 您的context引用未解析,因为您没有该名称的变量或属性,就像您在ViewActivity中那样。 获得onBindViewHolder最方便的方法是viewHolder.itemView.context(或从JavaviewHolder.itemView.getContext()(。

共享首选项用于持久化数据,并不完全适合在 RecyclerView 中使用,因为它的操作可能会减慢应用程序的速度。有关详细信息,请参阅开发人员文档,了解为什么不一定以这种方式使用它以及最佳应用位置。

在您的情况下,最好在适配器初始化之前的某个时间点从SharedPreferences检索数据,并在初始化期间传递数据。

假设性能不是关键,您可以像以前一样继续这样做,只需使用viewHolder.itemView.context从其中一个视图中检索上下文。您还可以将上下文引用从活动传递到适配器。

最新更新