android - imageView 在 recyclerview viewholder 中为 null

标签 android kotlin android-recyclerview nullpointerexception

我想为回收站 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/

相关文章:

android - 将样式应用于全屏(从/到)

android - Firebase - 未找到 GetTokenResult、getExpirationTimestamp()

android - 将 Dispatcher.Main 与 delay() 一起使用是个好主意吗?

android - 如何使用Kotlin在所有 Activity 中播放背景音乐?

android - Recyclerview 布局在 fragment 中不起作用

android - GridLayoutManager - 如何自动调整列?

android - CCA : Chrome identity pops up Account Chooser every time

Android:没有 "peripheral” 角色的 BLE?

android - RecyclerView - GridLayoutManager - 双向滚动

android - 后退按钮显示空白屏幕