Button on item in RecyclerView using FirebaseRecyclerAdapter with Kotlin

Viewed 114

My Activity looks like this...

class UtfordringerActivity : AppCompatActivity() {

    private lateinit var mRecyclerView: RecyclerView
    lateinit var mDatabase: DatabaseReference


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_utfordringer)
        supportActionBar?.title = "Utfordringer"

        recyclerview_utfordringer.layoutManager = LinearLayoutManager(this)

        // Firebase Realtime db noden vi setter inn i recyclerviewet
        mDatabase = FirebaseDatabase.getInstance().getReference("Utfordringer")
        mRecyclerView = findViewById(R.id.recyclerview_utfordringer)

        updateToRecyclerView()
    }



    // Funksjon som henter data og setter inn i RecyclerViewet med FirebaseRecyclerAdapter
    private fun updateToRecyclerView() {

        val firebaseRecyclerAdapter = object : FirebaseRecyclerAdapter<Utfordringer, CustomViewHolder>(
                Utfordringer::class.java,
                R.layout.utfordring_item,
                CustomViewHolder::class.java,
                mDatabase
        ) {
            override fun populateViewHolder(viewHolder: CustomViewHolder?, model: Utfordringer?, position: Int) {

                if (model != null) {
                    viewHolder?.itemView?.recyclerview_text_1?.text = model.kategori
                }
                if (model != null) {
                    viewHolder?.itemView?.recyclerview_text_2?.text = model.utfordring
                }
            }
        }
        mRecyclerView.adapter = firebaseRecyclerAdapter
    }


    // Viewholder
    class CustomViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {


    }

}

And my recyclerview looks like this after getting the data from Firebase Realtime Db and works as intended. Havent implemented anything for the thrashcan button yet, since that's when the trouble starts.

My RecyclerView

I want to make that button delete the item from the recyclerview and from Firebase Realtime Db at the same time. But as I understand it putting an onClickListener on a button in a recyclerview creates errors...

The items in the recyclerview are saved in Firebase with this code from another Activity

 private fun lagreUtfor() {
        val kategori = utfordring_kat_text.text.toString()
        val utfordring = utfordring_text.text.toString()

        if (kategori.isEmpty() || utfordring.isEmpty()) {
            Toast.makeText(this, "Vennligst fyll ut feltene", Toast.LENGTH_SHORT).show()
        } else
            if (kategori.isNotEmpty() || utfordring.isNotEmpty()) {
                val map = mutableMapOf<String, Any>()
                map["kategori"] = kategori
                map["utfordring"] = utfordring
                FirebaseDatabase.getInstance().reference
                        .child("/Utfordringer")
                        .push()
                        .setValue(map)
                Toast.makeText(this, "Lagret", Toast.LENGTH_SHORT).show()
            }

    }

I'm not looking for a complete solution or get anything for free without learning it. I just hope that someone can point me in the right direction or help me a little bit :)

1 Answers

You can put onClick listener on recyclerView item. In the item adapter copy this:

private var onClickListener: OnClickListener? = null

 fun setOnClickListener(onClickListener: OnClickListener)
    {
        this.onClickListener = onClickListener
    }


interface OnClickListener
    {
        fun onClick(position: Int, model: YourItemModel)
    }

In your onBindViewHolder put this:

holder.itemView.setOnClickListener {
                if (onClickListener != null)
                {
                    onClickListener!!.onClick(position, model)
                }
            }

Finally when you setup your recyclerView just use adapter like this:

adapter.setOnClickListener(object : SomethingAdapter.OnClickListener
        {
            override fun onClick(position: Int, model: YourItemModel) {
               
            }
        })

You can even use swiping left/right to do certain actions on recyclerView items with Swipe to do something callback.

Related