Search code examples
javaandroidarraylistreturn

Not able to return arraylist outside the scope, it becomes null


When i am copying the data obtained(contained in arraylist) into a new arraylist and returning it, the new arraylist does not return any value. onDataReceived(ArrayList arrayList) is the listener callback method after the data has been asynchronously fetched through volley in arraylist.

package com.example.bike.ViewModels;

import android.app.Application;
import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.LiveData;
import android.support.annotation.NonNull;
import com.example.bike.Models.BikesInfo;
import com.example.bike.Repository.BikesRepository;
import com.example.bike.Repository.Listener;
import com.example.bike.Views.ApplicationContext;
import java.util.ArrayList;
import java.util.Collections;

public class BikesViewModel extends AndroidViewModel {
 private BikesRepository bikesRepository;
 public static ArrayList<BikesInfo> vmarrayList = new ArrayList<>();
 public BikesViewModel(@NonNull Application application) {
    super(application);
     bikesRepository = new BikesRepository(application, new Listener() {
            @Override
            public void onDataReceived(ArrayList<BikesInfo> arrayList) {

                vmarrayList.addAll(arrayList);
            }

            @Override
            public void onError(int error) {

            }
        });
        bikesRepository.getArrayList();

    }

public ArrayList<BikesInfo> getbikesinfolistobservable(){
       return vmarrayList;
  }

}

Edit: MainActivity.java

package com.example.bike.Views.ui;

import android.arch.lifecycle.AndroidViewModel;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.example.bike.Models.BikesInfo;
import com.example.bike.R;
import com.example.bike.ViewModels.BikesViewModel;
import com.example.bike.Views.Adapters.BikesListAdapter;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    BikesViewModel bikesViewModel;

    RecyclerView recyclerView;
    LinearLayoutManager linearLayoutManager;
    BikesListAdapter bikesListAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.bikes_recycler);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setHasFixedSize(true);

        bikesViewModel = ViewModelProviders.of(MainActivity.this).get(BikesViewModel.class);

        bikesListAdapter = new BikesListAdapter(bikesViewModel.getbikesinfolistobservable());
        recyclerView.setAdapter(bikesListAdapter);

    }

}

Solution

  • If you are using volley to make a request you cannot ensure the call of getbikesinfolistobservable() will be executed after the request finshed, as its an async request.

    Try to do a console log on vmarrayList after vmarrayList.addAll(arrayList). If it's still empty then ArrayList arrayList is empty too, so it would be a problem with the request's response.

    Also vmarrayList is a static variable and class BikesViewModel is public, so you won't need a getter.