как я могу получить данные firebase и перенести их в представление переработчика?

# #android #firebase #android-studio #kotlin #firebase-realtime-database

Вопрос:

Я новичок в firebase и хочу внедрить определенные значения из базы данных firebase в режиме реального времени в свой переработчик-представление, в котором есть изображение с библиотекой «Glide» и текстовое представление с заголовком и кнопкой со ссылкой на amazon. Я попробовал несколько ответов из разных вопросов StackOverflow, но ни один из них, похоже, не работает со мной.

вот мои данные в реальном времени

  • Я хочу связать product_image с представлением изображения с помощью Glide
  • Я хочу связать product_title с текстовым представлением
  • Я хочу связать amazon с кнопкой

изображение данных в реальном времени

Вот мой класс данных

  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)

}
 

Наконец, вот мой фрагмент, где я называю представление переработчика

 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))
}
 

Любая помощь будет признательна

Комментарии:

1. Что именно в этом коде работает не так, как вы ожидаете? Расскажите нам, что не так с общим кодом. Есть ли у вас какие-либо ошибки?

2. @AlexMamo проблема заключалась в том, что данные firebase не отображаются в представлении recycler, когда я запускаю код

Ответ №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()
        }

    })
}
 

Вот моя база данных // у них должны быть те же переменные, что и у моего класса данных

моя база данных