Ruby
Ruby

Reputation: 1

Unable to display data in recycler view from room db

Getting error at NewActivity, as getting error while adding the data in array list and loading it to recycler view. Iam working on a project where I have to load Room data in recycler view. I am getting an error in for loop .. tried using foreach still getting tge same error. Error is showing while using add method to load a data from list to arraylist

package com.app.mycontacts;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Adapter;

import com.app.mycontacts.AddContactActivity.AddContactActivity;
import com.app.mycontacts.Data.ContactDetails;
import com.app.mycontacts.Data.ContactRepository;
import com.app.mycontacts.Data.MyAdapterClass;
import com.app.mycontacts.R;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.ArrayList;
import java.util.List;

public class NewActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    ArrayList<ContactDetails> contactarrayList;
    RecyclerView.LayoutManager layoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView= findViewById(R.id.reyclerview);

        new LoadDataTask().execute();
    }


    class LoadDataTask extends AsyncTask<Void,Void,Void> {

        ContactRepository contactRepository;
        List<ContactDetails> contactList1;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            contactRepository = new ContactRepository(getApplicationContext());
        }

        @Override
        protected Void doInBackground(Void... voids) {

            contactList1=contactRepository.getContactsDetails();
            contactarrayList= new ArrayList<ContactDetails>();

            for(int i=0; i<=contactList1.size();i++){

                contactarrayList.add(contactList1.get(i));
               
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void unused) {
            super.onPostExecute(unused);

            recyclerView.setLayoutManager(new LinearLayoutManager(NewActivity.this));

            MyAdapterClass myAdapterClass= new MyAdapterClass(NewActivity.this,contactarrayList);
            recyclerView.setAdapter(myAdapterClass);
        }
    }

}




Tried debugging the code, app is getting crash at the above stage.. Expecting to display the data inserted at room db.

Upvotes: 0

Views: 37

Answers (1)

TheLibrarian
TheLibrarian

Reputation: 1888

You are indexing wrong in the loop.

The size of the list is 4 but Java indexes from 0. So if you have 4 elements it goes [0], [1], [2], [3]

for(int i=0; i<=contactList1.size();i++){
    contactarrayList.add(contactList1.get(i));       
}

What you are doing is reaching for the fifth element - [0], [1], [2], [3], [4].

This will work:

for(int i=0; i < contactList1.size();i++){
    contactarrayList.add(contactList1.get(i));       
}

But you don't need to iterate it, you should be able to just call .addAll.

contactarrayList.addAll(contactList1);       

Upvotes: 1

Related Questions