0

我在显示 BindedDevices 的 Fragment 中有 RecycledView。当我在 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()

    }
}
4

1 回答 1

2

您已devices在未使用的列表中添加了一个附加列表 ( ) adapter(但您将其用于适配器数据集的大小)。

getItemCountFirebaseRecyclerAdapter. 无需覆盖它。

试试这个:

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)

    }
}
于 2020-03-17T08:46:12.380 回答