I am new to android studio and I have been trying to implement a recycler view and a pie chart fetching data from an API on to my app use search bar onto my app did it in a way and it worked but as l was adding more function to the application it started crushing with the above error
Logcat (Errors):
2022-06-28 10:21:02.158 9803-9803/com.example.covid19app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.covid19app, PID: 9803
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
at java.util.ArrayList.<init>(ArrayList.java:191)
at com.example.covid19app.MainActivity$1.onResponse(MainActivity.java:83)
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onResponse$0$DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:89)
at retrofit2.-$$Lambda$DefaultCallAdapterFactory$ExecutorCallbackCall$1$hVGjmafRi6VitDIrPNdoFizVAdk.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:888)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:8178)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
2022-06-28 10:21:02.179 9803-9803/com.example.covid19app I/Process: Sending signal. PID: 9803 SIG: 9
My code (Adapter.java):
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import com.hbb20.CountryCodePicker;
import org.eazegraph.lib.charts.PieChart;
import org.eazegraph.lib.models.PieModel;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
CountryCodePicker countryCodePicker;
TextView mtodaytotal,mtotal,mactive,mtodayactive,mrecovered,mtodayrecovered,mdeaths,mtodaydeaths;
String country;
TextView mfilter;
Spinner spinner;
String[] types={"cases","deaths","recovered","active"};
private List<ModelClass> modelClassList;
private List<ModelClass> modelClassList2;
PieChart mpiechart;
private RecyclerView recyclerView;
com.example.covid19app.Adapter adapter;
//Initialize
DrawerLayout drawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().hide();
countryCodePicker=findViewById(R.id.ccp);
mtodayactive=findViewById(R.id.todayactive);
mactive=findViewById(R.id.activecase);
mdeaths=findViewById(R.id.todaydeaths);
mtodaydeaths=findViewById(R.id.totaldeaths);
mrecovered=findViewById(R.id.recoveredcases);
mtodayrecovered=findViewById(R.id.todayrecovered);
mtotal=findViewById(R.id.totalcase);
mtodaytotal=findViewById(R.id.todaytotal);
mpiechart=findViewById(R.id.piechart);
spinner=findViewById(R.id.spinner);
mfilter=findViewById(R.id.filter);
recyclerView=findViewById(R.id.recyclerview);
modelClassList=new ArrayList<>();
modelClassList2=new ArrayList<>();
spinner.setOnItemSelectedListener(this);
ArrayAdapter arrayAdapter=new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item,types);
arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(arrayAdapter);
ApiUtilities.getAPIInterface().getcountrydata().enqueue(new Callback<List<ModelClass>>() {
@Override
public void onResponse(Call<List<ModelClass>> call, Response<List<ModelClass>> response) {
modelClassList2.addAll(response.body());
//adapter.notify();
adapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<List<ModelClass>> call, Throwable t) {
}
});
adapter=new Adapter(getApplicationContext(),modelClassList2);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
countryCodePicker.setAutoDetectedCountry(true);
country=countryCodePicker.getSelectedCountryName();
countryCodePicker.setOnCountryChangeListener(new CountryCodePicker.OnCountryChangeListener() {
@Override
public void onCountrySelected() {
country=countryCodePicker.getSelectedCountryName();
fetchdata();
}
});
fetchdata();
//Assign variable
drawerLayout = findViewById(R.id.drawer_layout);
}
private void fetchdata() {
ApiUtilities.getAPIInterface().getcountrydata().enqueue(new Callback<List<ModelClass>>() {
@Override
public void onResponse(Call<List<ModelClass>> call, Response<List<ModelClass>> response) {
// modelClassList.addAll(response.body());
for (int i=0; i<modelClassList.size(); i++)
{
if (modelClassList.get(i).getCountry().equals(country))
{
mactive.setText((modelClassList.get(i).getActive()));
mtodaydeaths.setText((modelClassList.get(i).getTodayDeaths()));
mtodayrecovered.setText((modelClassList.get(i).getTodayRecovered()));
mtodaytotal.setText((modelClassList.get(i).getTodayCases()));
mtotal.setText((modelClassList.get(i).getCases()));
mdeaths.setText((modelClassList.get(i).getDeaths()));
mrecovered.setText((modelClassList.get(i).getRecovered()));
int active,total,recovered,deaths;
active=Integer.parseInt(modelClassList.get(i).getActive());
total=Integer.parseInt(modelClassList.get(i).getCases());
recovered=Integer.parseInt(modelClassList.get(i).getRecovered());
deaths=Integer.parseInt(modelClassList.get(i).getDeaths());
updateGraph(active,total,recovered,deaths);
}
}
}
@Override
public void onFailure(Call<List<ModelClass>> call, Throwable t) {
}
});
}
private void updateGraph(int active, int total, int recovered, int deaths) {
mpiechart.clearChart();
mpiechart.addPieSlice(new PieModel("Confirm",total,Color.parseColor("#FFB701")));
mpiechart.addPieSlice(new PieModel("Active",active,Color.parseColor("#FF4caf50")));
mpiechart.addPieSlice(new PieModel("Recovered",recovered,Color.parseColor("#38ACCD")));
mpiechart.addPieSlice(new PieModel("Deaths",deaths,Color.parseColor("#F55c47")));
mpiechart.startAnimation();
}