RecyclerView adapter stop working after refactor

Paweł Bocian :

I have RecycledView in Fragment which display BindedDevices. When I have all code in Fragment class, it works. I want to do refactor and separate adapter to another class but when I do, adapter stoped working. Do anyone have a solution ?

Working fragment code :

package com.example.lightmeup.Fragments

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.lightmeup.Adapter.BindedDeviceAdapter
import com.example.lightmeup.ViewHolder.BindedDeviceViewHolder
import com.example.lightmeup.Model.BindedDeviceItem
import com.example.lightmeup.R
import com.firebase.ui.database.FirebaseRecyclerAdapter
import com.firebase.ui.database.FirebaseRecyclerOptions
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase

class AllDevicesFragment : Fragment() {

    private lateinit var mDatabase: DatabaseReference
    private lateinit var rootView: View

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        rootView = inflater.inflate(R.layout.fragment_alldevices, container, false)
        return rootView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (FirebaseAuth.getInstance().currentUser?.uid != null) {
            var uid = FirebaseAuth.getInstance().currentUser!!.uid
            mDatabase = FirebaseDatabase.getInstance().reference.child(uid)
            mDatabase.keepSynced(true)
        }

        var bindedDevicesRecycledView = rootView.findViewById(R.id.bindedDevicesRecycledView) as RecyclerView
        bindedDevicesRecycledView.layoutManager = LinearLayoutManager(activity)
        bindedDevicesRecycledView.setHasFixedSize(true)


        var options = FirebaseRecyclerOptions.Builder<BindedDeviceItem>()
            .setQuery(mDatabase,BindedDeviceItem::class.java).build()

        var adapter = object : FirebaseRecyclerAdapter<BindedDeviceItem, BindedDeviceViewHolder>(options) {
            override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindedDeviceViewHolder {
                val layoutInflater = LayoutInflater.from(parent.context)
                val cellForRow = layoutInflater.inflate(R.layout.binded_device_item, parent ,false)
                return BindedDeviceViewHolder(
                    cellForRow
                )
            }

            override fun onBindViewHolder(holder: BindedDeviceViewHolder, position: Int, bindedDevice: BindedDeviceItem) {
                holder.bind(bindedDevice)
            }

        }

        adapter.startListening()
        bindedDevicesRecycledView.adapter = adapter
    }

    override fun onStart() {
        super.onStart()

   }
}

Adapter after refactor :

package com.example.lightmeup.Adapter

import android.view.LayoutInflater
import android.view.ViewGroup
import com.example.lightmeup.Model.BindedDeviceItem
import com.example.lightmeup.R
import com.example.lightmeup.ViewHolder.BindedDeviceViewHolder
import com.firebase.ui.database.FirebaseRecyclerAdapter
import com.firebase.ui.database.FirebaseRecyclerOptions

open class BindedDeviceAdapter(var bindedDevices: FirebaseRecyclerOptions<BindedDeviceItem>): FirebaseRecyclerAdapter<BindedDeviceItem, BindedDeviceViewHolder>(bindedDevices) {

    var devices: MutableList<BindedDeviceItem> = arrayListOf()

    override fun getItemCount(): Int {
        return devices.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindedDeviceViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        val cellForRow = layoutInflater.inflate(R.layout.binded_device_item, parent ,false)
        return BindedDeviceViewHolder(cellForRow)
    }

    override fun onBindViewHolder(holder: BindedDeviceViewHolder, position: Int, bindedDeviceItem: BindedDeviceItem) {
        holder.bind(bindedDeviceItem)

    }

}

Fragment code after refactor

package com.example.lightmeup.Fragments

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.lightmeup.Adapter.BindedDeviceAdapter
import com.example.lightmeup.ViewHolder.BindedDeviceViewHolder
import com.example.lightmeup.Model.BindedDeviceItem
import com.example.lightmeup.R
import com.firebase.ui.database.FirebaseRecyclerAdapter
import com.firebase.ui.database.FirebaseRecyclerOptions
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase

class AllDevicesFragment : Fragment() {

    private lateinit var adapter: BindedDeviceAdapter
    private lateinit var mDatabase: DatabaseReference
    private lateinit var rootView: View

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        rootView = inflater.inflate(R.layout.fragment_alldevices, container, false)
        return rootView
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        if (FirebaseAuth.getInstance().currentUser?.uid != null) {
            var uid = FirebaseAuth.getInstance().currentUser!!.uid
            mDatabase = FirebaseDatabase.getInstance().reference.child(uid)
            mDatabase.keepSynced(true)
        }

        var bindedDevicesRecycledView = rootView.findViewById(R.id.bindedDevicesRecycledView) as RecyclerView
        bindedDevicesRecycledView.layoutManager = LinearLayoutManager(activity)
        bindedDevicesRecycledView.setHasFixedSize(true)


        var options = FirebaseRecyclerOptions.Builder<BindedDeviceItem>()
            .setQuery(mDatabase,BindedDeviceItem::class.java).build()

        adapter = BindedDeviceAdapter(options)
        adapter.startListening()

        bindedDevicesRecycledView.adapter = adapter
    }

    override fun onStart() {
        super.onStart()

    }
}
Bartek Lipinski :

You've added an additional list (devices) within the adapter which is not used (yet you use it for the size of the adapter dataset).

getItemCount is handled by the FirebaseRecyclerAdapter. No need to override it.

Try this instead:

class BindedDeviceAdapter(var bindedDevices: FirebaseRecyclerOptions<BindedDeviceItem>): FirebaseRecyclerAdapter<BindedDeviceItem, BindedDeviceViewHolder>(bindedDevices) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindedDeviceViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        val cellForRow = layoutInflater.inflate(R.layout.binded_device_item, parent ,false)
        return BindedDeviceViewHolder(cellForRow)
    }

    override fun onBindViewHolder(holder: BindedDeviceViewHolder, position: Int, bindedDeviceItem: BindedDeviceItem) {
        holder.bind(bindedDeviceItem)

    }
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=301597&siteId=1