Адаптер RecyclerView перестает работать после рефакторинга - PullRequest
0 голосов
/ 17 марта 2020

У меня есть RecycledView во фрагменте, который отображает BindedDevices. Когда у меня есть весь код в классе Fragment, он работает. Я хочу сделать рефакторинг и отделить адаптер от другого класса, но когда я это сделал, адаптер перестал работать. У кого-нибудь есть решение?

Код рабочего фрагмента:

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()

   }
}

Адаптер после рефакторинга:

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)

    }

}

Код фрагмента после рефактор

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()

    }
}

1 Ответ

2 голосов
/ 17 марта 2020

Вы добавили дополнительный список (devices) в adapter, который не используется (но вы используете его для размера набора данных адаптера).

getItemCount обрабатывается FirebaseRecyclerAdapter. Нет необходимости переопределять его.

Попробуйте вместо этого:

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)

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