1

I am using AndroidViewModel in application.But when my application is opened the method in ViewModelclass not called and data is not set on RecyclerView.This is code for my Model

class public class Foodie {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}  

This is code for my ViewModel class which extends AndroidViewModel so that I can use Volley in my application.

public class FoodieViewModel extends AndroidViewModel {
   public MutableLiveData<Foodie> foodieList;

    public FoodieViewModel(@NonNull Application application) {
        super(application);
    }

    public MutableLiveData<Foodie> getFoodies(){
        if(foodieList==null){
            foodieList=new MutableLiveData<>();
            loadFoodies();
        }
        return foodieList;
    }

    public void loadFoodies(){
        String url="someURL";
        JsonArrayRequest request =new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                try {
                    for(int i=0;i<response.length();i++){
                        JSONObject obj=response.getJSONObject(i);
                        Foodie foodie=new Foodie();
                        String name=obj.getString("firstname");
                        foodie.setName(name);
                        foodieList.setValue(foodie);
                    }

                }catch (JSONException e){
                    e.printStackTrace();
                }


            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }){
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                String auth ="JWT token";
                headers.put("Authorization", auth);
                headers.put("Content-Type", "application/json");
                return headers;
            }

        };
        AppController.getInstance().addToRequestQueue(request);
    }
}  

This is code for my MainActivity where data is set in RecyclerView

public class MainActivity extends AppCompatActivity {

    ArrayList<Foodie> foodies;
    RecyclerView recyclerView;
    FoodieAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView=(RecyclerView)findViewById(R.id.recyclerview);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        FoodieViewModel model= ViewModelProviders.of(this).get(FoodieViewModel.class);
        model.getFoodies().observe(this, new Observer<Foodie>() {
            @Override
            public void onChanged(@Nullable Foodie foodie) {
                adapter=new FoodieAdapter(foodies,MainActivity.this);
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }
        });
    } 

But when application is opened the LoadFoodies method is never called and data is not set on Recyclerview. How to resolve this ?

Vishist Varugeese
  • 1,500
  • 1
  • 17
  • 30
Satyam Gondhale
  • 1,415
  • 1
  • 16
  • 43

1 Answers1

0

Should be

public class FoodieViewModel extends AndroidViewModel {
    public MutableLiveData<List<Foodie>> foodieList;

    public FoodieViewModel(@NonNull Application application) {
        super(application);
    }

    public MutableLiveData<List<Foodie>> getFoodies(){
        if(foodieList==null){
            foodieList=new MutableLiveData<>();
            loadFoodies();
        }
        return foodieList;
    }

    public void loadFoodies(){
        String url="someURL";
        JsonArrayRequest request =new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                try {
                    int length = response.length();
                    List<Foodie> list = new ArrayList<>(length);
                    for(int i = 0; i < length; i++){
                        JSONObject obj=response.getJSONObject(i);
                        Foodie foodie = new Foodie();
                        String name = obj.getString("firstname");
                        foodie.setName(name);
                        list.add(foodie);
                    }
                    foodieList.setValue(list);

And

public class MainActivity extends AppCompatActivity {

    // ArrayList<Foodie> foodies;
    RecyclerView recyclerView;
    FoodieAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView=(RecyclerView)findViewById(R.id.recyclerview);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        FoodieViewModel model= ViewModelProviders.of(this).get(FoodieViewModel.class);
        model.getFoodies().observe(this, new Observer<Foodie>() {
            @Override
            public void onChanged(@Nullable List<Foodie> foodies) {
                adapter=new FoodieAdapter(foodies,MainActivity.this);
EpicPandaForce
  • 79,669
  • 27
  • 256
  • 428