Как реализовать диалоговое окно с предупреждением внутри адаптера в списке объявлений RecyclerView Kotlin? - PullRequest
0 голосов
/ 22 апреля 2020

я пытаюсь создать диалоговое окно предупреждения для элемента адаптера. Мне удалось сделать это на java, но я пытаюсь сделать это на kotlin.

Это основной класс, где я запускаю адаптер.

fun buildDetailsAdapter() {
        //recicler view saleDetails
        val saleDetail = SaleDetail()
        val saleDetailList = saleDetail.getSaleDetailsbyIdSaleHeader(idSaleHeader)
        Log.i(TAG, "buildProductsAdapter " + saleDetailList.size)

        val saleDetailAdapter = PreProductDevolutionKAdapter(saleDetailList, context)

            saleDetailAdapter.setOnClickListener(View.OnClickListener { v ->
                val builder = AlertDialog.Builder(this)
                builder.setTitle("Androidly Alert")
                builder.setMessage("We have a message")
                //builder.setPositiveButton("OK", DialogInterface.OnClickListener(function = x))

                builder.setPositiveButton(android.R.string.yes) { dialog, which ->
                    Toast.makeText(applicationContext,
                            android.R.string.yes, Toast.LENGTH_SHORT).show()
                }

                builder.setNegativeButton(android.R.string.no) { dialog, which ->
                    Toast.makeText(applicationContext,
                            android.R.string.no, Toast.LENGTH_SHORT).show()
                }

                builder.setNeutralButton("Maybe") { dialog, which ->
                    Toast.makeText(applicationContext,
                            "Maybe", Toast.LENGTH_SHORT).show()
                }
                builder.show()
            })

        rcvProductDevolution.adapter = saleDetailAdapter
    }

Это класс адаптера

class PreProductDevolutionKAdapter(val items : List<SaleDetail>, val context: Context) : RecyclerView.Adapter<ViewHolder>() {

    private var listener: View.OnClickListener? = null


    override fun onCreateViewHolder(parent: ViewGroup, p1: Int): ViewHolder {
        return ViewHolder(LayoutInflater.from(context).inflate(R.layout.adapter_pre_product_devolution_k, parent, false))
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.txtIdProductSaleDetailsAdapter.text = items[position].idProduct.toString()
        holder.txtQuantitySaleDetailsAdapter.text = items[position].quantity.toString()
        holder.txtQuantityToReturnAvailable.text = items[position].quantityReturn.toString()
        holder.txtUnitSaleDetailProductValue.text = items[position].unitValue.toString()
        holder.txtValuetotSaleDetailsAdapter.text = items[position].totValue.toString()
    }

    // Gets the number of animals in the list
    override fun getItemCount(): Int {
        return items.size
    }

    fun setOnClickListener(listener: View.OnClickListener) {
        this.listener = listener
    }


}

class ViewHolder (view: View) : RecyclerView.ViewHolder(view) {
    // Holds the TextView that will add each animal to
    val txtIdProductSaleDetailsAdapter: TextView = view.txtIdProductSaleDetailsAdapter
    val txtQuantitySaleDetailsAdapter: TextView = view.txtQuantitySaleDetailsAdapter
    val txtQuantityToReturnAvailable: TextView = view.txtQuantityToReturnAvailable
    val txtUnitSaleDetailProductValue: TextView = view.txtUnitSaleDetailProductValue
    val txtValuetotSaleDetailsAdapter : TextView= view.txtValuetotSaleDetailsAdapter
}

Вид адаптера раздувается нормально, и информация отображается, как и ожидалось, но когда я нажимаю на элемент, ничего не происходит.

Любая помощь или предложения были бы хорошими. спасибо

Ответы [ 3 ]

1 голос
/ 22 апреля 2020

В дополнение к ответу Joozd сделайте следующее:

class ViewHolder (view: View) : RecyclerView.ViewHolder(view) {
    // Holds the TextView that will add each animal to
    val linearLayout: Linearlayout= view.linearLayout   
}

затем

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    (...)
    holder.linearLayout.setOnClickListener(listener)
    }
0 голосов
/ 22 апреля 2020

Вы не вызываете слушателя в вашем onBindViewHolder. Просто добавьте строку, добавляющую onClickListener к тому, что должно прослушивать onClick, и оно должно работать, например.

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    (...)
    holder.backgroundLayoutForYourLayout.setOnClickListener(listener)
    }
0 голосов
/ 22 апреля 2020

Передайте контекст Activity в constructor из Adapter

Внутри ViewHolder добавьте прослушиватель щелчков, как показано ниже:

txtIdProductSaleDetailsAdapter.setOnClickListener(View.OnClickListener { v ->
                val builder = AlertDialog.Builder(context)
                builder.setTitle("Androidly Alert")
                builder.setMessage("We have a message")
                //builder.setPositiveButton("OK", DialogInterface.OnClickListener(function = x))

                builder.setPositiveButton(android.R.string.yes) { dialog, which ->
                    Toast.makeText(context,
                            android.R.string.yes, Toast.LENGTH_SHORT).show()
                }

                builder.setNegativeButton(android.R.string.no) { dialog, which ->
                    Toast.makeText(context,
                            android.R.string.no, Toast.LENGTH_SHORT).show()
                }

                builder.setNeutralButton("Maybe") { dialog, which ->
                    Toast.makeText(applicationContext,
                            "Maybe", Toast.LENGTH_SHORT).show()
                }
                builder.show()
            })
})

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...