【问题标题】:how can I retrieve firebase data and implement it to recycler view?如何检索 firebase 数据并将其实施到回收站视图?
【发布时间】:2021-11-13 05:51:05
【问题描述】:

我是 firebase 新手,我想将 firebase 实时数据库中的特定值实现到我的 recycler-view 中,该视图有一个带有“Glide”库的图像视图和一个带有标题和按钮的文本视图链接到亚马逊。我尝试了来自不同 StackOverflow 问题的几个答案,但似乎没有一个适合我。

这是我的实时数据

  • 我想使用 Glide 将 product_image 链接到图像视图
  • 我想将 product_title 链接到文本视图
  • 我想将 amazon_link 链接到一个按钮

这是我的数据类

 data class affiliateRvModel(val affiliate_title : String = "",
                            val affiliate_image : String = "",
                            val affiliate_desc: String = "",
                            val affiliate_amazon_link: String = ""){


}

这是我的回收站视图

class AffiliateRVadapter(val context: Context, val AFFILIATE_LIST : ArrayList<affiliateRvModel>) :
RecyclerView.Adapter<AffiliateRVadapter.ViewHolder>() {


override fun onCreateViewHolder(
    parent: ViewGroup,
    viewType: Int
): AffiliateRVadapter.ViewHolder {

    val view = LayoutInflater.from(parent.context).inflate(R.layout.affiliate_rv_layout, parent, false)
    return ViewHolder(view)
}
override fun getItemCount(): Int {
    return AFFILIATE_LIST.size
}



@RequiresApi(Build.VERSION_CODES.M)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {

    val affiliate_list : affiliateRvModel = AFFILIATE_LIST[position]

    holder.affiliate_title.text = affiliate_list.affiliate_title
    holder.affiliate_desc.text = affiliate_list.affiliate_desc
    Glide.with(context)
        .load(affiliate_list.affiliate_image)
        .into(holder.affiliate_image)

    val amazon_link = affiliate_list.affiliate_amazon_link
    holder.store_btn1.setOnClickListener {
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse(amazon_link))
        context.startActivity(intent)
    }
}

class ViewHolder(itemview: View): RecyclerView.ViewHolder(itemview){

    val affiliate_title = itemview.findViewById<TextView>(R.id.affiliate_title)
    val affiliate_desc = itemview.findViewById<TextView>(R.id.affiliate_desc)
    val affiliate_image = itemview.findViewById<ImageView>(R.id.affiliate_image)
    var store_btn1 = itemview.findViewById<Button>(R.id.storeBtn1)
    val store_btn2 = itemview.findViewById<Button>(R.id.storeBtn2)

}

最后,这是我的 Fragment,我称之为回收站视图

val AFFILIATE_LIST : ArrayList<affiliateRvModel> = ArrayList()
     var title_value : String = ""
    var image_value : String = ""
    var amazon_link : String = ""
 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val adapter = AffiliateRVadapter(requireContext(),AFFILIATE_LIST)
    affiliateRV.layoutManager =  LinearLayoutManager(context, RecyclerView.VERTICAL, false)
   affiliateRV.setHasFixedSize(true)
    affiliateRV.adapter = adapter

    realtimeFirebaseData()

    storeAffiliateList(title_value, image_value, amazon_link)

}

fun realtimeFirebaseData(){
    val database = FirebaseDatabase.getInstance()
    val mRef = database.getReference("affiliate_store")
    
    mRef.addValueEventListener(object : ValueEventListener {

        override fun onDataChange(snapshot: DataSnapshot) {
            if(snapshot.exists()){

                for (list in snapshot.children){

                    title_value = list.child("product_title").getValue(String::class.java)!!
                    image_value = list.child("product_image").getValue(String::class.java)!!
                    amazon_link = list.child("amazon_link").getValue(String::class.java)!!
                    
                }

            }
        }


        override fun onCancelled(error: DatabaseError) {
            Log.w(TAG, "onCancelled", error.toException())
            Toast.makeText(context, "$error was happened", Toast.LENGTH_SHORT).show()
        }

    })
}
fun storeAffiliateList(product_title : String, product_image : String, amazon_link: String){

    AFFILIATE_LIST.add(affiliateRvModel(product_title
        , product_image
        ,"هذا شرح تجريبي لوصف المنتج وما هو الشيء الذي يمكنك استخدامه فيه" +
                "\n 1) بأمكانك الغاء ضهور الاعلانات في اي وقت " +
                "\n 2) بأمكانك استعمال النقود لشراء عدد من الخدمات" +
                "\n 3) بأمكانك استئجار اي صوت تريدة "
        , amazon_link))

    AFFILIATE_LIST.add(affiliateRvModel(product_title, product_image
        ,"هذا شرح تجريبي لوصف المنتج وما هو الشيء الذي يمكنك استخدامه فيه" +
                "\n 1) بأمكانك الغاء ضهور الاعلانات في اي وقت " +
                "\n 2) بأمكانك استعمال النقود لشراء عدد من الخدمات" +
                "\n 3) بأمكانك استئجار اي صوت تريدة "
        , amazon_link))

    AFFILIATE_LIST.add(affiliateRvModel(product_title,product_image
        ,"هذا شرح تجريبي لوصف المنتج وما هو الشيء الذي يمكنك استخدامه فيه" +
                "\n 1) بأمكانك الغاء ضهور الاعلانات في اي وقت " +
                "\n 2) بأمكانك استعمال النقود لشراء عدد من الخدمات" +
                "\n 3) بأمكانك استئجار اي صوت تريدة "
        , amazon_link))
}

任何帮助将不胜感激

【问题讨论】:

  • 这段代码中到底有什么不符合您的预期?告诉我们共享代码有什么问题。你有什么错误吗?
  • @AlexMamo 问题是当我运行代码时,firebase 数据没有显示在回收站视图中

标签: android firebase android-studio kotlin firebase-realtime-database


【解决方案1】:

谢天谢地,我能够解决这个问题。显然,我应该让我的 kotlin 文件中的数据类变量看起来与我的实时数据库变量相同。

这是我现在的数据类 //变量需要与数据库中的键相同

 data class affiliateRvModel(val product_title : String? = null,
                            val product_info : String?= null,
                            val product_image : String? = null,
                            val amazon_link : String? = null){
}

这是我的片段

private lateinit var  AFFILIATE_LIST : ArrayList<affiliateRvModel>
private lateinit var mRef: DatabaseReference
private lateinit var recyclerView : RecyclerView

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    recyclerView = view.findViewById(R.id.affiliateRV)
    recyclerView.layoutManager = LinearLayoutManager(context)
    recyclerView.setHasFixedSize(true)

    AFFILIATE_LIST = arrayListOf<affiliateRvModel>()

}
override fun onStart() {
    super.onStart()

    realtimeFirebaseData()

}
 fun realtimeFirebaseData(){
    val database = FirebaseDatabase.getInstance()
    mRef = database.getReference("affiliate_store")
    
    mRef?.addValueEventListener(object : ValueEventListener {

        override fun onDataChange(snapshot: DataSnapshot) {

             AFFILIATE_LIST.clear()

            if (snapshot.exists()) {


                for (list in snapshot.children) {

                    val data = list.getValue(affiliateRvModel::class.java)
                    AFFILIATE_LIST.add(data!!)

                }
                recyclerView.adapter = AffiliateRVadapter(requireContext(), AFFILIATE_LIST)

            }


        }


        override fun onCancelled(error: DatabaseError) {
            Log.w(TAG, "onCancelled", error.toException())
            Toast.makeText(context, "$error was happened", Toast.LENGTH_SHORT).show()
        }

    })
}

这是我的数据库 // 它们需要与我的数据类具有相同的变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多