imageView является нулевым в окне просмотра - PullRequest
1 голос
/ 20 сентября 2019

Я хочу установить прослушиватель onClick для imageView, присутствующего в представлении рециркулятора.Но всякий раз, когда я передаю изображение из метода onViewCreated () из фрагмента, оно по-прежнему равно null и выдает исключение NullPointerException при вызове setOnClickListener.

Это классы 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
    }
    …
}

Журналполученное сообщение является истинным, и когда я нажимаю на изображение, оно не отвечает на мои клики.Как мне успешно реализовать onClickListener для моего imageView?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2019

должно работать, если вы измените onViewCreated на:

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val adapter = Adapter(mutableListOf(..), fragmentmanager!!, view.imageView) // Specify which imageView you mean, as there might be a bunch of these fragments or none, system doesn't know. 

или выполните весь view.findViewById (), если вы не используете kotlinx thingies

0 голосов
/ 21 сентября 2019

Класс ViewHolder должен находиться внутри Адаптера как внутренний класс.При этом imageView не является нулевым.Примерно так: -

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

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

    override fun getItemCount() = list.size

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

    inner class ViewHolder(itemView: View, context: Context) :
        RecyclerView.ViewHolder(itemView) {
        private lateinit var item: Due

        init {
            Log.i("ViewHolder", (imageView == null).toString()) //log prints 'false'
            itemView.dropdown_menu.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 datePickerFragment = DatePickerFragment()
                            datePickerFragment.show(manager, "date picker")
                        }
                    }
                    true
                }
                popup.show()
            }
        }

        fun putData(due: Due) {
            …
        }
    }
}

И мы создаем экземпляр адаптера как: -

val adapter = Adapter(mutableListOf(…), fragmentmanager!!)
0 голосов
/ 20 сентября 2019

Вы никогда не инициализируете imageView.Поскольку вы используете (?.) При настройке onClickListner для ImageView, вы не получите никакого сбоя из-за безопасного вызова.Один из лучших способов сделать это:

class ShowDuesFragment: Fragment () {переопределить fun onCreateView (inflater: LayoutInflater, container: ViewGroup ?, saveInstanceState: 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
    }
}

}

Адаптер класса (список приватных значений: список, менеджер приватных значений: FragmentManager, приватный вид изображений 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])

}

class ViewHolder (itemView: просмотр, контекст: контекст, менеджер: FragmentManager): RecyclerView.ViewHolder (itemView), DatePickerDialog.OnDateSetListener{lateinit var item: Due

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
}
…

}

...