【发布时间】:2020-07-28 16:31:45
【问题描述】:
我正在尝试从 REST API 获取一些数据,但我遇到了问题,因为我有一些具有不同数量的项目的对象。
例如:
[{7 items}, {7 items}, {6 items}...{1 item}]
它们具有相同的键,但问题在于某些对象,可能缺少一个或多个参数。
我的应用开始运行,但是当我尝试向下滚动时它崩溃了。我收到了这个错误:
Attempt to read from field 'android.widget.TextView com.example.covidapp.covidAdapter$ViewHolder.tv_activeCases' on a null object reference.
这是我的MainActivity 和ListView:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private ListView listView;
private covidAdapter covidAdapter;
private CovidApi covidApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list_view_main);
Gson gson = new GsonBuilder().serializeNulls().create();
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://covid-19-tracking.p.rapidapi.com/")
.addConverterFactory(GsonConverterFactory.create(gson)).build();
covidApi = retrofit.create(CovidApi.class);
Call<List<covid>> call = covidApi.getInfo();
call.enqueue(new Callback<List<covid>>() {
@Override
public void onResponse(Call<List<covid>> call, Response<List<covid>> response) {
if (!response.isSuccessful()){
return;
}
List<covid> covids = response.body();
covidAdapter = new covidAdapter((ArrayList<covid>) covids, getApplicationContext());
listView.setAdapter(covidAdapter);
}
@Override
public void onFailure(Call<List<covid>> call, Throwable t) {
Toast.makeText(MainActivity.this,t.getMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
这是Adapter 类:
public class covidAdapter extends BaseAdapter {
private ArrayList<covid> covidList;
private Context context;
public covidAdapter(ArrayList<covid> covidList, Context context){
this.covidList = covidList;
this.context = context;
}
@Override
public int getCount() {
return this.covidList.size();
}
@Override
public Object getItem(int i) {
return this.covidList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inf.inflate(R.layout.template, null);
holder = new ViewHolder();
holder.tv_activeCases =(TextView)convertView.findViewById(R.id.textview_active_cases);
holder.tv_country =(TextView)convertView.findViewById(R.id.textview_country);
//holder.tv_lastUpdate =(TextView)convertView.findViewById(R.id.textview_last_update);
holder.tv_newCases =(TextView)convertView.findViewById(R.id.textview_new_cases);
holder.tv_newDeaths =(TextView)convertView.findViewById(R.id.textview_new_deaths);
holder.tv_totalCases =(TextView)convertView.findViewById(R.id.textview_total_cases);
holder.tv_totalDeaths =(TextView)convertView.findViewById(R.id.textview_total_deaths);
holder.tv_totalRecovered =(TextView)convertView.findViewById(R.id.textview_total_recovered);
} else {
holder = (ViewHolder) convertView.getTag();
}
covid covid = covidList.get(position);
if ( covidList.size() < 0){
System.out.println("No dps key");
}else {
holder.tv_activeCases.setText("Active Cases: " + covid.getActive());
holder.tv_country.setText("Country: " + covid.getCountry());
// holder.tv_lastUpdate.setText("Last Update: " + covid.getLastUpdate());
holder.tv_newDeaths.setText("New Deaths: " + covid.getNewDeaths());
holder.tv_newCases.setText("New Cases: " + covid.getNewCases());
holder.tv_totalRecovered.setText("Recovered: " + covid.getRecovered());
holder.tv_totalDeaths.setText("Deaths: " + covid.getTotalDeaths());
holder.tv_totalCases.setText("Total Cases: " + covid.getTotalCases());
}
return convertView;
}
private static class ViewHolder{
public TextView tv_country, tv_activeCases, tv_newCases, tv_newDeaths, tv_totalCases, tv_totalDeaths, tv_totalRecovered;
}
}
我将不胜感激。
【问题讨论】:
-
嗨罗伯特。该代码正在创建一个持有者,但它似乎没有存储它。它需要调用 setTag。问候。
-
哦,是的....非常感谢!
-
没问题,很乐意为您提供帮助:)
标签: java android json retrofit2