首页 > 解决方案 > 如何在recyclerview中显示嵌套的子数据

问题描述

我想在 recyclerview 中显示项目节点详细信息,但出现了一些错误。我尝试了很多方法,但是我没有在数据库引用中的项目节点中获得项目的 uid。我正在尝试在 firebase 数据库参考中获取项目 uid,但无法做到。如何获取项目 uid 数据库参考对象

mainactivity code


class MainActivity : AppCompatActivity() {

lateinit var recyclerView: RecyclerView

lateinit var layoutManager: RecyclerView.LayoutManager

lateinit var RecyclerAdapter: RecyclerAdapter
lateinit var databaseReference: DatabaseReference
var database: FirebaseDatabase? = null

lateinit var auth:FirebaseAuth

    var personlist = arrayListOf<Persons>()


 override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)


    recyclerView = findViewById(R.id.recyclerpersonview)



    database = FirebaseDatabase.getInstance()
    auth = FirebaseAuth.getInstance()

     





 databaseReference=database?.reference!!.child("Users")
.child(auth.currentUser!!.uid).child("items")

                                                                             
    databaseReference.addValueEventListener(object 
:ValueEventListener{

        override fun onDataChange(snapshot: DataSnapshot) {
            try {

                for (items in snapshot.children) {
                    val item1 = items.getValue(Persons::class.java)
                    personlist.add(item1!!)
                }

            }catch (e:Exception){
                
    
  
 
 
    
Toast.makeText(this@MainActivity,e.message,Toast.LENGTH_SHORT).show()
            }

        }
        override fun onCancelled(error: DatabaseError) {
            Toast.makeText(this@MainActivity,"unable to load 
    data",Toast.LENGTH_SHORT).show()
        }


    })

    layoutManager = LinearLayoutManager(this)

    RecyclerAdapter = RecyclerAdapter(this, personlist)

    RecyclerAdapter.notifyDataSetChanged()

    recyclerView.adapter = RecyclerAdapter

    recyclerView.layoutManager = layoutManager

   }

  recycleradapter code


 class RecyclerAdapter(var context: MainActivity, var personlist: 
  ArrayList<Persons>) :
 RecyclerView.Adapter<RecyclerAdapter.Personviewholder>() {
 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
 Personviewholder {
    val view = 
 LayoutInflater.from(parent.context).inflate(R.layout.singlerow, 
parent, 
  false)

    return Personviewholder(view)
}

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

override fun onBindViewHolder(holder: Personviewholder, position: 
Int) {
    val view = personlist[position]
    holder.personname.text = view.personname
    holder.persondesc.text = view.persondesc
    
Picasso.with(context).load(view.personimage).into(holder.personimg)

    holder.layoutlist.setOnClickListener {
        val intent = Intent(context, Additem::class.java)
        context.startActivity(intent)

    }

}


inner class Personviewholder(view: View) : 
RecyclerView.ViewHolder(view) 
 {
    var personname: TextView = view.findViewById(R.id.tvname)
    var persondesc: TextView = view.findViewById(R.id.tvpersondesc)
    var personimg: ImageView = view.findViewById(R.id.imgperson)
    var layoutlist: LinearLayout = 
 view.findViewById(R.id.linearlayoutlist)
 }
 }

data class
data class Persons( var personname:String,
                var persondesc:String,
                var personimage:String)   


debug information
06/21 22:05:29: Launching 'app' on Pixel 3 API 30.
$ adb shell am start -n 
"com.a.recyclerview/com.a.recyclerview.LoginActivity" -a 
android.intent.action.MAIN -c android.intent.category.LAUNCHER -D
Waiting for application to come online: com.a.recyclerview | 
com.a.recyclerview.test
Waiting for application to come online: com.a.recyclerview | 
com.a.recyclerview.test
Connecting to com.a.recyclerview
Capturing and displaying logcat messages from application. This 
behavior can be disabled in the "Logcat output" section of the 
"Debugger" settings page.
I/System.out: Debugger has connected
waiting for debugger to settle...
Connected to the target VM, address: 'localhost:8602', transport: 
'socket'
I/chatty: uid=10155(com.a.recyclerview) identical 6 lines
I/System.out: waiting for debugger to settle...
I/System.out: debugger has settled (1337)
D/NetworkSecurityConfig: No Network Security Config specified, using 
 platform default
D/NetworkSecurityConfig: No Network Security Config specified, using 
platform default

I/FirebaseApp:设备解锁:初始化应用程序的所有 Firebase API [DEFAULT] I/FirebaseAuth:[FirebaseAuth:] 准备创建服务连接到后备实现 D/FirebaseAuth:通知 id 令牌侦听器有关用户 (rwy6MpJLxYWyIAQbj2xFR0sRaRw2)。I/FirebaseInitProvider:FirebaseApp 初始化成功 D/libEGL:加载 /vendor/lib/egl/libEGL_emulation.so D/libEGL:加载 /vendor/lib/egl/libGLESv1_CM_emulation.so I/DynamiteModule:考虑本地模块 com.google.android。 gms.measurement.dynamite:51 和远程模块 com.google.android.gms.measurement.dynamite:51 com.google.android.gms.measurement.dynamite 的选定远程版本,版本 >= 51 V/DynamiteModule:炸药装载机版本>= 2,使用 loadModule2NoCrashUtils D/libEGL: 加载 /vendor/lib/egl/libGLESv2_emulation.so W/.a.recyclervie:

(greylist, reflection, allowed)
Accessing hidden method Landroid/view/ViewGroup;- 

未找到跟踪代码管理器,因此不会使用 V/FA:连接尝试已在进行中 V/FA:连接尝试已在进行中 I/OpenGLRenderer:Davey!持续时间=757ms;Flags=1, IntendedVsync=3149655912401, Vsync=3149722579065, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=3149736734700, AnimationStart=3149737212900, PerformTraversalsStart=3149737532500, DrawStart=3150142325100, SyncQueued=3150160621300, SyncStart=3150229754900, IssueDrawCommandsStart=3150230091100, SwapBuffers= 3150464728600,FrameCompleted=3150482529700,DequeueBufferDuration=422700,QueueBufferDuration=1357200,GpuCompleted=72904454231491230,D/FA:连接到远程服务 V/FA:处理排队的服务任务:5 I/.a.recyclervie:WaitForGcSaverComplete 上的配置文件被阻塞5. 416ms D/CompatibilityChangeReporter:Compat change id 报告:147798919;用户标识符 10155;状态:启用 V/FA:不活动,与服务断开连接

![](https://i.stack.imgur.com/WR6Pd.png)

标签: androidfirebasefirebase-realtime-databaseandroid-recyclerview

解决方案


你得到了child("items")两次,所以最终尝试读取/Users/$uid/items/items没有数据的地方。

要解决此问题,只需指定child("items")一次:

databaseReference = 
database?.reference!!.child("Users").child(auth.currentUser!!.uid).child("items")

databaseReference.addValueEventListener(object :ValueEventListener{
  ...

推荐阅读