【问题标题】:RecyclerView adapter stop working after refactorRecyclerView 适配器在重构后停止工作
【发布时间】:2020-03-16 21:53:39
【问题描述】:

我在显示 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()

    }
}

【问题讨论】:

  • 确保代码重构后FirebaseAuth.getInstance().currentUser?.uid != null 相同。用户可能会被注销。
  • 您的adapter stoped working 是什么意思?数据不显示?应用崩溃?
  • 告诉我们共享代码有什么问题。你有什么错误吗?

标签: android firebase kotlin android-recyclerview


【解决方案1】:

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

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)

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多