gpt4 book ai didi

android - imageView 在 recyclerview viewholder 中为 null

转载 作者:行者123 更新时间:2023-11-30 05:02:23 25 4
gpt4 key购买 nike

我想为回收站 View 中的 imageView 设置一个 onClick 监听器。但是每当我从 fragment 的 onViewCreated() 方法传递 imageview 时,它仍然为 null 并在我调用 setOnClickListener 时抛出 NullPointerException。

这些是 Kotlin 类。

class ShowDuesFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(R.layout.fragment_show, container, false)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val adapter = Adapter(mutableListOf(..), fragmentmanager!!, imageView)
recycler_view.apply {
layoutManager = LinearLayoutManager(activity!!.applicationContext)
setHasFixedSize(true)
this.adapter = adapter
}
}
}

class Adapter(private val list: List<Due>, private val manager: FragmentManager, private val imageView: ImageView?) : RecyclerView.Adapter<ViewHolder> {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
ViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.card_view,
parent,
false
),
parent.context,
manager,
imageView
)

override fun getItemCount() = list.size

override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.putData(list[position])
}

class ViewHolder(itemView: View, context: Context, manager: FragmentManager, imageView: ImageView? = null) :
RecyclerView.ViewHolder(itemView), DatePickerDialog.OnDateSetListener {
lateinit var item: Due

init {
Log.i("ViewHolder", (imageView == null).toString()) //log prints 'true'
imageView?.setOnClickListener {
val popup = PopupMenu(context, it)
popup.menuInflater.inflate(R.menu.menu_popup, popup.menu)
popup.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.notify -> {
val datePicker = DatePickerFragment()
datePicker.show(manager, "DatePickerFragment")
}
}
context.toast((item as Due).name)
true
}
popup.show()
}
}

fun putData(due: Due) {

item = due
}

}

我收到的日志消息是真实的,当我点击 imageView 时,它没有响应我的点击。如何成功地为我的 imageView 实现 onClickListener?

最佳答案

您永远不会初始化 imageView。当您在将 onClickListner 设置为 ImageView 时使用 ( ?.) 时,您不会因安全调用而发生任何崩溃。一种更好的方法是:

类 ShowDuesFragment : Fragment() { 覆盖乐趣 onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_show, 容器, false)

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val adapter = Adapter(mutableListOf(..), fragmentmanager!!)
recycler_view.apply {
layoutManager = LinearLayoutManager(activity!!.applicationContext)
setHasFixedSize(true)
this.adapter = adapter
}
}

类适配器(私有(private) val 列表:List,私有(private) val 管理器:FragmentManager,私有(private) val imageView:ImageView?):RecyclerView.Adapter {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
ViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.card_view,
parent,
false
),
parent.context,
manager
)

override fun getItemCount() = list.size

override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.putData(list[position])

类 ViewHolder(itemView: View ,上下文:上下文,管理器:FragmentManager):RecyclerView.ViewHolder(itemView), DatePickerDialog.OnDateSetListener { lateinit var 项目:到期

init {
val imageView = itemView //Cast this to image view if required you can use itemView.findViewById for other //views.
Log.i("ViewHolder", (imageView == null).toString()) //log prints 'true'
imageView?.setOnClickListener {
val popup = PopupMenu(context, it)
popup.menuInflater.inflate(R.menu.menu_popup, popup.menu)
popup.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.notify -> {
val datePicker = DatePickerFragment()
datePicker.show(manager, "DatePickerFragment")
}
}
context.toast((item as Due).name)
true
}
popup.show()
}
}

fun putData(due: Due) {

item = due
}

关于android - imageView 在 recyclerview viewholder 中为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58034466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com