Java – RecyclerView does not initially load data

RecyclerView does not initially load data… here is a solution to the problem.

RecyclerView does not initially load data

I use Spinner and RecyclerView in the fragment of my Android project.
Until I select an item in Spinner, my RecyclerView doesn’t display any data.
What should I do to display the results of RecyclerView without selecting items from the spinner?
The first Recycle Bin should show 10 attractions.

My code:

Attractive .java

 package com.rayantec.reservation.reservationdemo.Model;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.rayantec.reservation.reservationdemo.Adapter.AttractionAdapter;
import com.rayantec.reservation.reservationdemo.G;
import com.rayantec.reservation.reservationdemo.Lists.AttractionList;
import com.rayantec.reservation.reservationdemo.Lists.CityList;
import com.rayantec.reservation.reservationdemo.R;
import com.toptoche.searchablespinnerlibrary.SearchableSpinner;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

public class Attractions extends Fragment {
    RecyclerView recyclerView;
    ArrayList<AttractionList> AttractionData =  new ArrayList<>();
    public SearchableSpinner spinnerCitiest;
    ArrayList<CityList> cityLists = new ArrayList<>();

ProgressDialog progressDialog;

public void showCity(View view) {
        spinnerCitiest = (SearchableSpinner) view.findViewById(R.id.SpinnerCitiestId);
        spinnerCitiest.setTitle("Please Select City");
        spinnerCitiest.setPositiveButton("Ok");
        spinnerCitiest.setSelection(2);
        JsonArrayRequest JsonObjectRequest = new JsonArrayRequest(Request.Method.GET, G.serverURL + "/android/jsyncs/getdata/city", null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                progressDialog.dismiss();
                try {
                    for (int i = 0; i < response.length(); i++) {
                        JSONObject jsonOBJ = response.getJSONObject(i);
                        String id = jsonOBJ.getString("id");
                        String title = jsonOBJ.getString("title");
                        cityLists.add(new CityList(id, title));
                    }
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }

}
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                progressDialog.dismiss();
                Toast.makeText(G.context, "Server Connection error", Toast.LENGTH_SHORT).show();
            }
        });
        JsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(7000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        RequestQueue requestQueue = Volley.newRequestQueue(G.context);
        requestQueue.add(JsonObjectRequest);

ArrayAdapter<CityList> adapterCities = new ArrayAdapter<CityList>(G.context, android. R.layout.simple_spinner_item, cityLists);
        adapterCities.setDropDownViewResource(android. R.layout.simple_spinner_dropdown_item);
        spinnerCitiest.setAdapter(adapterCities);

spinnerCitiest.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
                CityList cityList = (CityList) adapterView.getSelectedItem();
                Toast.makeText(G.context, "City ID: " + cityList.getId() + ",  City Name : " + cityList.getTitle(), Toast.LENGTH_SHORT).show();

}

@Override
            public void onNothingSelected(AdapterView<?> adapterView) {

}
        });
    }

public void showRandomAttractions(View view) {
        recyclerView = (RecyclerView) view.findViewById(R.id.RecyclerAttracionId);
        JsonArrayRequest JsonObjectRequests = new JsonArrayRequest(Request.Method.GET, G.serverURL + "/android/jsyncs/getdata/randattraction", null, new Response.Listener<JSONArray >() {
            @Override
            public void onResponse(JSONArray response) {
                progressDialog.dismiss();
                AttractionList sampledata = new AttractionList();
                try {
                    for (int i = 0; i < response.length(); i++) {
                        JSONObject jsonOBJs = response.getJSONObject(i);
                        String id = jsonOBJs.getString("id");
                        String title = jsonOBJs.getString("title");
                        String imageUrl = jsonOBJs.getString("imageUrl");
                        String location = jsonOBJs.getString("location");
                        String type = jsonOBJs.getString("type");
                        String body = jsonOBJs.getString("body");
                        AttractionData.add(new AttractionList(id, title, body, location, imageUrl, type));
                    }
                } catch (JSONException e1) {
                    e1.printStackTrace();
                }

}
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                progressDialog.dismiss();
                Toast.makeText(G.context, "Server Connection error", Toast.LENGTH_SHORT).show();
            }
        });
        JsonObjectRequests.setRetryPolicy(new DefaultRetryPolicy(7000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        RequestQueue requestQueue = Volley.newRequestQueue(G.context);
        requestQueue.add(JsonObjectRequests);

recyclerView.setLayoutManager(new LinearLayoutManager(G.context, LinearLayoutManager.VERTICAL, false));
        AttractionAdapter attractionAdapter = new AttractionAdapter(AttractionData);
        recyclerView.setAdapter(attractionAdapter);
    }

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.attraction, container, false);

progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("Please wait ...");
        progressDialog.setCancelable(false);
        progressDialog.show();

showCity(view);
        showRandomAttractions(view);

return view;
    }
}

Attractive .xml

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">

<android.support.v7.widget.CardView
        android:id="@+id/cardviewattraction"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:padding="3dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

<com.toptoche.searchablespinnerlibrary.SearchableSpinner
            android:id="@+id/SpinnerCitiestId"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_marginTop="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginBottom="8dp"
            android:padding="3dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
             />
    </android.support.v7.widget.CardView>

<android.support.v7.widget.RecyclerView
        android:id="@+id/RecyclerAttracionId"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/cardviewattraction"
        tools:ignore="MissingConstraints" />

</android.support.constraint.ConstraintLayout>

Attraction adapter

 package com.rayantec.reservation.reservationdemo.Adapter;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.rayantec.reservation.reservationdemo.Lists.AttractionList;
import com.rayantec.reservation.reservationdemo.R;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;

public class AttractionAdapter extends RecyclerView.Adapter<AttractionAdapter.AttractionViewHolder> {
    ArrayList<AttractionList> attractionArrayList;

public AttractionAdapter(ArrayList<AttractionList> attractions) {
        attractionArrayList = new ArrayList<>();
        attractionArrayList = attractions;
    }

@NonNull
    @Override
    public AttractionViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_attraction, parent, false);
        return  new AttractionViewHolder(view);
    }

@Override
    public void onBindViewHolder(@NonNull AttractionViewHolder holder, int position) {
        AttractionList dataModel = attractionArrayList.get(position);
        holder.txtTitle.setText(dataModel.getTitle());
        holder.txtBody.setText(dataModel.getBody());
        holder.txtType.setText(dataModel.getType());
        holder.txtLocation.setText(dataModel.getLocation());
        Picasso.get().load(dataModel.getImgUrl()).resize(130, 100).centerCrop().into(holder.imgAttraction);
    }

@Override
    public int getItemCount() {
        return attractionArrayList.size();
    }

public class AttractionViewHolder extends RecyclerView.ViewHolder{
        public ImageView imgAttraction;
        public TextView txtTitle;
        public TextView txtBody;
        public TextView txtLocation;
        public TextView txtType;

public AttractionViewHolder(View itemView) {
            super(itemView);
            imgAttraction = (ImageView)itemView.findViewById(R.id.img_recycler_attraction);
            txtTitle = (TextView)itemView.findViewById(R.id.txt_recycler_attractionTitle);
            txtBody = (TextView)itemView.findViewById(R.id.txt_recycler_attractionBody);
            txtLocation = (TextView)itemView.findViewById(R.id.txt_recycler_attractionPositions);
            txtType = (TextView)itemView.findViewById(R.id.txt_recycler_attractionType);
        }
        //
    }
}

Attractions list .java

 package com.rayantec.reservation.reservationdemo.Lists;

public class AttractionList {
    private String id;
    private String title;
    private String body;
    private String location;
    private String imgUrl;

public AttractionList(String id, String title, String body, String location, String imgUrl, String type) {
        this.id = id;
        this.title = title;
        this.body = body;
        this.location = location;
        this.imgUrl = imgUrl;
        this.type = type;
    }

public String getType() {
        return type;
    }

public void setType(String type) {
        this.type = type;
    }

private String type;

public String getId() {
        return id;
    }

public void setId(String id) {
        this.id = id;
    }

public String getTitle() {
        return title;
    }

public void setTitle(String title) {
        this.title = title;
    }

public String getBody() {
        return body;
    }

public void setBody(String body) {
        this.body = body;
    }

public String getLocation() {
        return location;
    }

public void setLocation(String location) {
        this.location = location;
    }

public String getImgUrl() {
        return imgUrl;
    }

public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }
}

Solution

You should test something, have you checked if you received an onResponse callback in the showRandomAttractions(View view) method? This verifies that the Get call works as expected.

If you receive an onResponse call, when you are finished adding data to AttractionData, try calling attractionAdapter.notifyDataSetChanged() after the for loop to the array list. It looks like this :

            try {
                for (int i = 0; i < response.length(); i++) {
                    JSONObject jsonOBJs = response.getJSONObject(i);
                    String id = jsonOBJs.getString("id");
                    String title = jsonOBJs.getString("title");
                    String imageUrl = jsonOBJs.getString("imageUrl");
                    String location = jsonOBJs.getString("location");
                    String type = jsonOBJs.getString("type");
                    String body = jsonOBJs.getString("body");
                    AttractionData.add(new AttractionList(id, title, body, location, imageUrl, type));

 Notify your adapter that its data has changed.
                    attractionAdapter.notifyDataSetChanged();
                }
            } catch (JSONException e1) {
                e1.printStackTrace();
            }

You can take a look at this documentation For more information about how notifyDataSetChanged works.

Related Problems and Solutions