Mick jAGGER
Mick jAGGER

Reputation: 189

RecyclerView not adding item loaded from Cloud Firestore Kotlin

I am loading in Data from Cloud Firestore. That data is then being added as an Item to a RecyclerView and should be displayed on the screen. However, the RecyclerView remains empty.

The data is loaded in correctly from Cloud Firestore (I can tell because of the logs I added which are shown below).

So I cannot find out why the data is not being added to the RecyclerView correctly and displayed?

ActiveOrderActivity.kt

class ActiveOrderActivity : AppCompatActivity() {
    private val aorderList = ArrayList<ActiveOrderModel>()
    private val adapter = AOrdersAdapter(aorderList)

    /* Access a Cloud Firestore instance from the Activity. */
    val db = Firebase.firestore

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

        recyclerview.adapter = adapter
        recyclerview.layoutManager = LinearLayoutManager(this)
        recyclerview.setHasFixedSize(true)

        db.collection("Orders - 18.3.2021")
            .get()
            .addOnSuccessListener { result ->
                for (document in result) {
                    Log.i("", "IN LOOP FOR DOCUMENT: ActiveOrderActivity.\n")
                    val customerName = document.getField<String>("customer Name")
                    Log.i("", "$customerName: ActiveOrderActivity.\n")
                    val customerNumber = document.getField<String>("customer Number")
                    val customerPostal = document.getField<String>("eircode")
                    val customerAddress = document.getField<String>("address")
                    val paymentAmount = document.getField<String>("payment Amount")
                    val paymentType =  document.getField<String>("payment Total")
                    val newItem = ActiveOrderModel(customerName = customerName,customerNumber = customerNumber,customerPostal = customerPostal,customerAddress = customerAddress,paymentAmount = paymentAmount,paymentType = paymentType)
                    aorderList.add(INDEX,newItem)
                    adapter.notifyItemInserted(INDEX)
                }
            }
   
    }

}

AOrdersAdapter.kt


class AOrdersAdapter(private val aorderList: List<ActiveOrderModel> ) : RecyclerView.Adapter<AOrdersAdapter.AOrderViewHolder>() {

    class AOrderViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val nameView = view.nameView
        val addressView = view.address1View
        val mobileView = view.mobileView
        val eircodeView = view.eircodeView
        val paymentView = view.paymentView
        val paymentAmountView = view.paymentAmountView
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AOrderViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.active_order_item, parent, false)

        return AOrderViewHolder(view)
    }

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

    override fun onBindViewHolder(holder: AOrderViewHolder, position: Int) {
        val currentItem = aorderList[position]

        holder.nameView.text = currentItem.customerName
        holder.addressView.text = currentItem.customerNumber
        holder.mobileView.text = currentItem.customerPostal
        holder.eircodeView.text = currentItem.customerAddress

        holder.paymentAmountView.text = currentItem.paymentAmount
        holder.paymentView.text = currentItem.paymentType
    }
}

activity_active_order.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainBody.dashboard.ordersActivites.ActiveOrderActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="wrap_content"
        android:layout_height="699dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="16dp"
        android:clipToPadding="false"
        android:padding="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.501"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/floatingActionButton"
        app:layout_constraintVertical_bias="0.0"
        tools:listitem="@layout/active_order_item" />

    <androidx.appcompat.widget.AppCompatButton
        android:id="@+id/floatingActionButton"
        android:layout_width="307dp"
        android:layout_height="68dp"
        android:layout_marginTop="88dp"
        android:background="@drawable/pizaa_button2"
        android:text="Main Menu"
        android:textColor="@color/white"
        android:textSize="16sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

active_order_item.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rowConstraintLayout"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:padding="16dp"
        android:layout_margin="4dp"
        app:cardElevation="10dp"
        app:cardCornerRadius="8dp"
        app:cardPreventCornerOverlap="false">

        <RelativeLayout
            android:layout_width="800dp"
            android:layout_height="match_parent"
            android:padding="12dp">

            <TextView
                android:id="@+id/nameView"
                android:layout_width="223dp"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_marginStart="6dp"
                android:layout_marginEnd="0dp"
                android:text="George Matthews"
                android:textColor="@color/shopColour"
                android:textSize="20sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/address1View"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/nameView"
                android:layout_alignParentStart="true"
                android:layout_marginStart="6dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="6dp"
                android:text="123 Fakelands,\nHigher up Road,\nDublin"
                android:textColor="@color/logoYellow"
                android:textSize="20sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/mobileView"
                android:layout_width="144dp"
                android:layout_height="wrap_content"
                android:layout_alignTop="@+id/productPriceView"
                android:layout_marginStart="20dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="1dp"
                android:layout_marginEnd="100dp"
                android:layout_toEndOf="@+id/nameView"
                android:text="089 215 2121"
                android:textColor="@color/shopColour"
                android:textSize="20sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/eircodeView"
                android:layout_width="87dp"
                android:layout_height="wrap_content"
                android:layout_below="@+id/mobileView"
                android:layout_alignEnd="@+id/mobileView"
                android:layout_marginStart="43dp"
                android:layout_marginLeft="0dp"
                android:layout_marginTop="11dp"
                android:layout_marginEnd="16dp"
                android:layout_marginBottom="1dp"
                android:layout_toEndOf="@+id/nameView"
                android:text="A96 K4D8"
                android:textColor="@color/logoYellow"
                android:textSize="20sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/paymentView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignTop="@+id/productPriceView"
                android:layout_marginStart="20dp"
                android:layout_marginLeft="2dp"
                android:layout_marginTop="1dp"
                android:layout_marginEnd="100dp"
                android:layout_toEndOf="@+id/mobileView"
                android:gravity="center"
                android:text="Frank's Website"
                android:textColor="@color/shopColour"
                android:textSize="20sp"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/paymentAmountView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/paymentView"
                android:layout_alignEnd="@+id/paymentView"
                android:layout_marginStart="144dp"
                android:layout_marginLeft="0dp"
                android:layout_marginTop="12dp"
                android:layout_marginEnd="-5dp"
                android:layout_marginBottom="1dp"
                android:layout_toEndOf="@+id/eircodeView"
                android:gravity="center"
                android:text="47.00"
                android:textColor="@color/logoYellow"
                android:textSize="20sp"
                android:textStyle="bold" />

        </RelativeLayout>
    </androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>

ActiveOrderModel.kt

data class ActiveOrderModel(
    val customerName: String? = null,
    val customerNumber: String? = null,
    val customerPostal: String? = null,
    val customerAddress: String? = null,
    val paymentAmount: String? = null,
    val paymentType: String? = null )

Here the running terminal shows that the data has been loaded correctly from the Cloud Firestore and the loop is working to iterate through all the entries in the Collection. Now each document should be added to the RecyclerView but the Recycler View is empty as shown below. enter image description here

enter image description here

Upvotes: 0

Views: 195

Answers (2)

Sandeep Pareek
Sandeep Pareek

Reputation: 1789

try this

fun initRecyclerView() {
    mainRecycler.setLayoutManager(LinearLayoutManager(context))
    var linearLayoutManager: LinearLayoutManager? = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
    mainRecycler?.layoutManager = linearLayoutManager
    val itemDecorator = VerticalSpacingItemDecorator(20)
    mainRecycler.addItemDecoration(itemDecorator)
    adapter = AOrdersAdapter(aorderList)
    mainRecycler.setAdapter(adapter)
}

and this

for (document in result) {
                Log.i("", "IN LOOP FOR DOCUMENT: ActiveOrderActivity.\n")
                val customerName = document.getField<String>("customer Name")
                Log.i("", "$customerName: ActiveOrderActivity.\n")
                val customerNumber = document.getField<String>("customer Number")
                val customerPostal = document.getField<String>("eircode")
                val customerAddress = document.getField<String>("address")
                val paymentAmount = document.getField<String>("payment Amount")
                val paymentType =  document.getField<String>("payment Total")
                val newItem = ActiveOrderModel(customerName = customerName,customerNumber = customerNumber,customerPostal = customerPostal,customerAddress = customerAddress,paymentAmount = paymentAmount,paymentType = paymentType)
                aorderList.add(INDEX,newItem)
                adapter.notifyItemInserted(INDEX)
            }
            adapter?.notifyDataSetChanged()

use adapter?.notifyDataSetChanged()
and must check your arraylist not be empty.

Upvotes: 0

Priyanka
Priyanka

Reputation: 1875

You need to update list in adapter to get desired result. Create a method in adapter as below -

fun updateList(list: List<ActiveOrderModel> ) {
    this.aorderList = list
    notifyDataSetChanged()
}

Update below lines in your activity

aorderList.add(INDEX,newItem)
adapter.updateList(aorderList)
adapter.notifyItemInserted(INDEX)

Upvotes: 1

Related Questions