RecyclerView not showing any items unless i press homebutton and reenter the activity

2020-04-01 java android android-recyclerview

The app doesn't show anything in the recycler view the first time I open it, but it shows the items after I press the home button and then press the overview button and open the app from there

here is the code in mainActivity

public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mlayoutManager;
private ProgressDialog dialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ArrayList<String> countryNmaeList =new ArrayList<>();

    final ArrayList<countryItem> countryList = new ArrayList<>();
    final ProgressDialog dialog = new ProgressDialog(this);
    dialog.setMessage("Loading data");



    mRecyclerView = findViewById(R.id.recyclerView);
    mAdapter=new countryAdapter(countryList);

    mlayoutManager=new LinearLayoutManager(this);

    mRecyclerView.setLayoutManager(mlayoutManager);





    dialog.show();
    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url("https://covid-193.p.rapidapi.com/statistics")
            .get()
            .addHeader("x-rapidapi-host", "covid-193.p.rapidapi.com")
            .addHeader("x-rapidapi-key", "xxxxxxxxxxxxx")
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(@NotNull Call call, @NotNull IOException e) {

        }

        @Override
        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            dialog.dismiss();
            String response1=response.body().string();
            try {
                //geting Jason object
                JSONObject jsonObject=new JSONObject(response1);
                JSONArray jsonArray = jsonObject.getJSONArray("response");
                for (int i=0;i<jsonArray.length();i++){
                    JSONObject country = jsonArray.getJSONObject(i);
                   JSONObject cases = country.getJSONObject("cases");
                    int activecaseint = cases.getInt("active");
                    int recoveredint =cases.getInt("recovered");
                    JSONObject death= country.getJSONObject("deaths");
                    int dtotal = death.getInt("total");
                    //adding items into country items 
                    countryList.add(new countryItem(country.getString("country"),String.valueOf(activecaseint),String.valueOf(recoveredint),String.valueOf(dtotal)));
                }



            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
    //nottifying the dataset changed 
    mAdapter.notifyDataSetChanged();
    mRecyclerView.setAdapter(mAdapter);


}

}

here is my adapter activity

countryAdapter.java

public class countryAdapter extends RecyclerView.Adapter<countryAdapter.countryViewHolder> {
    private ArrayList<countryItem> mCountryList;

    public static class countryViewHolder extends RecyclerView.ViewHolder{
        public TextView mCountryName;
        public TextView mActivePatients;
        public TextView mRecovered;
        public TextView mDeath;

        public countryViewHolder(@NonNull View itemView) {
            super(itemView);
            mCountryName=itemView.findViewById(R.id.CountyNameTv);
            mActivePatients=itemView.findViewById(R.id.activePatientsTv);
            mRecovered=itemView.findViewById(R.id.recoveredTv);
            mDeath=itemView.findViewById(R.id.deathTv);
        }
    }
    public countryAdapter(ArrayList<countryItem> countryList){
        mCountryList = countryList;
    }

    @NonNull
    @Override
    public countryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.itemview,parent,false);
        countryViewHolder cvh =new countryViewHolder(v);
        return cvh;
    }

    @Override
    public void onBindViewHolder(@NonNull countryViewHolder holder, int position) {
        countryItem currentItem=mCountryList.get(position);

        holder.mCountryName.setText(currentItem.getCountryname());
        holder.mActivePatients.setText(currentItem.getActivePatients());
        holder.mRecovered.setText(currentItem.getRecovered());
        holder.mDeath.setText(currentItem.getDeath());
    }

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

    public void swapData(ArrayList<countryItem> list) {
        if (list != null) {
            this.mCountryList.clear();
            this.mCountryList.addAll(list);
            notifyDataSetChanged();
        }
    }
}

i have tried putting notifyDataSetChanged inside the try but that didn't work. i hope you can find a way to fix this.

Answers

When you have new datalist update after adding it in list as:

 public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            dialog.dismiss();
            String response1=response.body().string();
            try {
                //geting Jason object
                JSONObject jsonObject=new JSONObject(response1);
                JSONArray jsonArray = jsonObject.getJSONArray("response");
                for (int i=0;i<jsonArray.length();i++){
                    JSONObject country = jsonArray.getJSONObject(i);
                   JSONObject cases = country.getJSONObject("cases");
                    int activecaseint = cases.getInt("active");
                    int recoveredint =cases.getInt("recovered");
                    JSONObject death= country.getJSONObject("deaths");
                    int dtotal = death.getInt("total");
                    //adding items into country items 
                    countryList.add(new countryItem(country.getString("country"),String.valueOf(activecaseint),String.valueOf(recoveredint),String.valueOf(dtotal)));
                }

            //adapter.swapData(countryList);
              updateData(countryList);

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

you can comment out following line:

 mAdapter.notifyDataSetChanged();

Add this function in your adapter class and call it when you need to update list:

public void swapData(ArrayList<countryItem> list) {
    if (list != null) {
        this.arrayList.clear();
        this.arrayList.addAll(list);
        notifyDataSetChanged();
    }
}

In your global object declaration change type of adapter to:

private countryAdapter mAdapter;

add this method in mainActivity and call when you want to update data:

public void updateData(ArrayList<countryItem> countryList) {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            mAdapter.swapData(countryList);
        }
    });
}

Instead of calling mAdapter.notifyDataSetChanged() at the end of onCreate() you should call it in onRespone() when the new data got set.

@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
    dialog.dismiss();
    String response1=response.body().string();
    try {
        //geting Jason object
        JSONObject jsonObject=new JSONObject(response1);
        JSONArray jsonArray = jsonObject.getJSONArray("response");
        for (int i=0;i<jsonArray.length();i++){
            JSONObject country = jsonArray.getJSONObject(i);
           JSONObject cases = country.getJSONObject("cases");
            int activecaseint = cases.getInt("active");
            int recoveredint =cases.getInt("recovered");
            JSONObject death= country.getJSONObject("deaths");
            int dtotal = death.getInt("total");
            //adding items into country items 
            countryList.add(new countryItem(country.getString("country"),String.valueOf(activecaseint),String.valueOf(recoveredint),String.valueOf(dtotal)));
        }
        mAdapter.notifyDataSetChanged();   // ←  notify adapter here!



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

Related