android - android - 如何将侦听器从片段传递给适配器?(科特林)
问题描述
我目前正在开发一个具有设置活动的应用程序。在此设置活动中,有一个 FrameLayout,它加载包含 RecyclerView 的片段。
在片段中,我必须向 RecyclerView 适配器传递 OnItemClick 函数所需的侦听器。我尝试使用context
而不是this
,但它不起作用。
您如何正确地将侦听器传递给适配器?
代码:
片段设置.kt
class FragmentSettingsMain : Fragment(), AdapterSettings.OnItemClickListener {
val settingsList = listOf(
DataItemsSettings(getString(R.string.look), getString(R.string.lookdescription), R.drawable.ic_colored_color_lens),
DataItemsSettings(getString(R.string.playing), getString(R.string.playingdescription), R.drawable.ic_colored_view_carousel),
DataItemsSettings(getString(R.string.images), getString(R.string.imagesdscription), R.drawable.ic_colored_image),
DataItemsSettings(getString(R.string.audio), getString(R.string.audiodescription), R.drawable.ic_colored_volume_up),
DataItemsSettings(getString(R.string.other), getString(R.string.otherdescription), R.drawable.ic_colored_shape),
DataItemsSettings(getString(R.string.about), getString(R.string.aboutdescription), R.drawable.ic_colored_info)
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retainInstance = true
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_settings_main, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
rvSettings.apply {
layoutManager = LinearLayoutManager(activity)
adapter = AdapterSettings(settingsList, NEEDS LISTENER HERE)
}
}
override fun OnItemClick(position: Int) {
when(position) {
0 -> //Start new fragment here
1 -> //Start new fragment here
2 -> //Start new fragment here
3 -> //Start new fragment here
4 -> //Start new fragment here
5 -> this.startActivity(Intent(this, ActivityAbout::class.java))
}
}
}
适配器设置.kt
class AdapterSettings(
var settingsList: List<DataItemsSettings>,
var listener: OnItemClickListener
) : RecyclerView.Adapter<AdapterSettings.SettingsViewHolder>() {
inner class SettingsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
init {
itemView.setOnClickListener(this)
}
override fun onClick(p0: View?) {
val position : Int = adapterPosition
if (position != RecyclerView.NO_POSITION) {
listener.OnItemClick(position)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SettingsViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_settings, parent, false)
return SettingsViewHolder(view)
}
override fun getItemCount(): Int {
return settingsList.size
}
override fun onBindViewHolder(holder: SettingsViewHolder, position: Int) {
holder.itemView.apply {
rvTitle.text = settingsList[position].stringTitle
rvDescription.text = settingsList[position].stringDescription
rvIcon.setImageResource(settingsList[position].itemIcon)
}
}
interface OnItemClickListener {
fun OnItemClick(position: Int)
}
}
解决方案
当您在应用块中使用它时,您需要在使用它时添加@FragmentSettingsMain。
AdapterSettings(settingsList,this@FragmentSettingsMain)
或者您可以使用
val listener = this
rvSettings.apply{
AdapterSettings(settingsList,listener)
}
推荐阅读
- angular - Angular:在按钮上有一个路由器链接
- windows - 如何处理 cmd.exe 中的长路径
- typo3 - TYPO3,routeEnhancers,用参数重写简单的url
- c# - 在不指定所有输入参数类型的情况下获取方法引用
- javascript - Highcharts 不更新 ajax 响应数据的数据
- date - 比较 VueJs 中的两个日期
- sql - SQL 错误 - 以 .. 开头的标识符太长 - 预览适用于 SSMS
- php - json_decode 函数 php://input 返回无效的 JSON 格式
- ruby-on-rails - 避免 Sidekiq 工作人员并发
- amazon-web-services - 将数据记录到 elasticsearch 服务器