android - 如何在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)
解决方案
你得到了child("items")
两次,所以最终尝试读取/Users/$uid/items/items
没有数据的地方。
要解决此问题,只需指定child("items")
一次:
databaseReference =
database?.reference!!.child("Users").child(auth.currentUser!!.uid).child("items")
databaseReference.addValueEventListener(object :ValueEventListener{
...
推荐阅读
- c# - 从字节数组派生像素颜色值
- raspberry-pi - 如何从按钮制作按钮
- python - 通过 SWIG 从 c++ 继承的 Python 类
- redux - 在不使用 bindActionCreaters 的情况下更改 redux 状态
- scala - 如何使用 junit 在 scala 中执行 IOException.class?
- mysql - 查询 sql 以与 python 一起使用
- spring - spring-ws .wsdl 不包含 ObjectFactory.class 或 jaxb.index
- c++ - 有没有办法在编译时获取作用域类名?
- c# - 可重用的非捕获组
- android - SoundPool 内存不足?