Только в состоянии отобразить последний подчиненный от firebase в моем представлении переработчика (Обновлено) - PullRequest
0 голосов
/ 16 апреля 2020

Я могу отобразить только последний дочерний элемент в myCars в программе recyclerView, но я не уверен, как я пытался использовать для l oop, но я не уверен, что это правильный способ написать его

this is my data in Firebase

это мой код для GpsFragment.kt Я попытался отобразить здесь свои данные и получил ошибку,

lateinit собственность автомобилей не была инициализирована

class GpsFragment : Fragment(), OnCarItemClickListener {
private var user = FirebaseAuth.getInstance().currentUser
val reqId = user!!.uid
lateinit var cars: List<Cars>
private val ref = FirebaseDatabase.getInstance().reference.child("users")

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    (context as AppCompatActivity).supportActionBar!!.title = "Gps"
    val root = inflater.inflate(R.layout.fragment_gps, container, false)

    return root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    addCarbtn.setOnClickListener {
        val intent = Intent(activity, AddCarActivity::class.java)
        activity?.startActivity(intent)
    }

    cars = emptyList()
    var adapter = CarAdapter(cars, this)
    myCarlist?.adapter = adapter
    showCars()

}

private fun showCars() {

    var carLat:String
    var carLng:String
    var name:String

    val query = ref.orderByChild("uid").equalTo(reqId)

    query.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onDataChange(dataSnapshot: DataSnapshot) {
                for (childDss in dataSnapshot.children) {
                    for (subChildren in childDss.child("myCars").children){
                        val count = childDss.child("myCars").childrenCount.toInt()
                        carLat = (subChildren.child("carlat").getValue(String::class.java)).toString()
                        carLng = (subChildren.child("carlng").getValue(String::class.java)).toString()
                        name = (subChildren.child("carid").getValue(String::class.java)).toString()
                        Log.d("carlat",carLat.toString())
                        Log.d("carlng",carLng.toString())
                        Log.d("name",name.toString())

                        cars = listOf(
                            Cars(name.toString(), carLat.toString(), carLng.toString())
                        )

                    }
                }
            myCarlist?.layoutManager = LinearLayoutManager(activity)
            myCarlist?.adapter = CarAdapter(cars,this@GpsFragment)
            myCarlist.adapter?.notifyDataSetChanged()

        }

    })

}

override fun onItemClick(cars: Cars, position: Int) {
    val intent = Intent(context, TrackingActivity::class.java)
    intent.putExtra("CARNAME", cars.name)
    intent.putExtra("LAT", cars.latitude)
    intent.putExtra("LNG", cars.longtitude)

    startActivity(intent)
}

}

Это мой код для Cars.kt

data class Cars(val name: String = "-",
            val latitude: String = "-",
            val longtitude: String = "-")

Это мой код для CarAdapter.kt

class CarAdapter (private val cars : List<Cars>, var clickListener: OnCarItemClickListener) : RecyclerView.Adapter<CarAdapter.CarViewHolder>(){

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CarViewHolder {
    val inflater = LayoutInflater.from(parent.context).inflate(R.layout.list_layout, parent, false)

    return  CarViewHolder(inflater)
}

override fun getItemCount() = cars.size

override fun onBindViewHolder(holder: CarViewHolder, position: Int) {
    val car = cars[position]

    holder.initialize(cars.get(position),clickListener)

}

class CarViewHolder(val view:View) : RecyclerView.ViewHolder(view){

    var carName = view.carname
    var lat = view.latitude
    var lng = view.longtitude

    fun initialize(cars: Cars, action:OnCarItemClickListener){
        carName.text = cars.name
        lat.text = cars.latitude
        lng.text = cars.longtitude

        view.setOnClickListener{
            action.onItemClick(cars, adapterPosition)
        }

    }
}

}

интерфейс OnCarItemClickListener {fun onItemClick (автомобили: автомобили, позиция: Int)}

1 Ответ

1 голос
/ 16 апреля 2020

API Firebase является асинхронным, поэтому, когда вы звоните myCarlist?.adapter = CarAdapter(cars,this), вызывается ли он до того, как данные извлекаются из базы данных, и, поскольку вы инициализируете cars внутри для l oop, то вы получаете ошибка в том, что он еще не инициализирован. Поэтому, чтобы решить эту проблему, вам нужно установить адаптер внутри onDataChange():

        override fun onDataChange(dataSnapshot: DataSnapshot) {
            if (dataSnapshot.exists())
            {
                for (childDss in dataSnapshot.children){
                    val count = childDss.child("myCar").childrenCount.toInt()
                    Log.d("count",count.toString())

                    for (i in 0 until count){
                        val carLat  = childDss.child("carlat").getValue(String::class.java)
                        val carLng  = childDss.child("carlng").getValue(String::class.java)
                        val name  = childDss.child("carid").getValue(String::class.java)

                        cars = listOf(
                            Cars(name.toString(),carLat.toString(),carLng.toString())
                        )

                    }
                      myCarlist?.adapter = CarAdapter(cars,this)
                }
            }
        }

...