📅  最后修改于: 2023-12-03 15:38:10.067000             🧑  作者: Mango
在本教程中,我们将使用Android Studio创建一个COVID-19跟踪器应用程序,该应用程序将向用户提供印度各州和城市的最新COVID-19数据。
首先,在Android Studio中创建一个新项目。选择“Empty Activity”作为项目模板。
在项目级别的build.gradle
文件中添加以下依赖:
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
}
这些依赖项将使我们能够使用Retrofit网络库来请求API,并将响应反序列化为Java对象。
现在,我们需要创建一个用于获取COVID-19数据的API。我们将使用COVID-19印度API,该API提供有关印度各州和城市的最新COVID-19数据。
创建一个Java接口文件并命名为CovidApi.java
,我们将使用Retrofit注解来定义API的不同端点。以下是一个示例:
public interface CovidApi {
@GET("/data.json")
Call<CovidDataResponse> getCovidData();
}
该接口定义了一个getCovidData
方法,该方法使用Retrofit注解@GET
,指定数据源。CovidDataResponse
是一个我们将编写的类,该类描述了响应数据的结构。
为了反序列化从API获取的响应数据,我们需要创建Java类,这与响应数据的结构相匹配。我们将创建以下类:
public class CovidDataResponse {
private List<StateData> stateDataList;
// getters and setters
}
public class StateData {
private String state;
private String confirmed;
private String active;
private String recovered;
private String deaths;
// getters and setters
}
在上面的代码中,CovidDataResponse
类包含有关印度各邦的数据列表,每个邦的数据定义在StateData
类中。
现在,我们需要为应用程序创建用户界面。对于这个例子,我们将使用RecyclerView来显示所有印度各邦的COVID-19数据。
在项目中创建一个XML布局文件,包含一个RecyclerView组件。例如:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/covid_data_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
接下来,在Activity类中获取RecyclerView组件并设置布局管理器和适配器。
RecyclerView recyclerView = findViewById(R.id.covid_data_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
CovidDataAdapter adapter = new CovidDataAdapter(new ArrayList<>());
recyclerView.setAdapter(adapter);
我们将创建一个名为CovidDataAdapter
的自定义适配器。底部的ArrayList<>
是传递到适配器中以进行显示的COVID-19数据列表。
在应用程序启动时,我们应该在后台发出异步API请求,并使用响应更新RecyclerView中的数据。
请注意,我们需要为从网络请求提供网络权限。请打开AndroidManifest
文件并添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
现在,我们需要在Activity中使用Retrofit库发起HTTP GET请求并处理响应。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.covid19india.org/state_district_wise/")
.addConverterFactory(GsonConverterFactory.create())
.build();
CovidApi covidApi = retrofit.create(CovidApi.class);
Call<CovidDataResponse> call = covidApi.getCovidData();
call.enqueue(new Callback<CovidDataResponse>() {
@Override
public void onResponse(Call<CovidDataResponse> call, Response<CovidDataResponse> response) {
CovidDataResponse covidDataResponse = response.body();
adapter.updateData(covidDataResponse.getStateDataList());
}
@Override
public void onFailure(Call<CovidDataResponse> call, Throwable t) {
Log.e(TAG, "onFailure: ", t);
}
});
在上述代码中,我们使用Retrofit库创建一个Retrofit实例retrofit
,并使用该实例创建CovidApi
接口的实现。
我们使用异步方式enqueue()
调用getCovidData
方法,该方法接收一个Response
对象作为参数,由该对象表示响应数据。在正常响应的情况下,我们将数据提取到一个List<StateData>
中,并使用适配器更新RecyclerView。
在CovidDataAdapter
类中,我们使用ViewHolder
模式创建子项目视图。 onBindViewHolder方法将在每个子项目视图加载时调用。
我们将在此方法中设置标题和条目信息。
@Override
public void onBindViewHolder(@NonNull CovidDataViewHolder holder, int position) {
StateData stateData = covidDataList.get(position);
holder.title.setText(stateData.getState());
holder.confirmCount.setText(stateData.getConfirmed());
holder.recoveredCount.setText(stateData.getRecovered());
holder.deathCount.setText(stateData.getDeaths());
holder.activeCount.setText(stateData.getActive());
}
我们需要更新适配器显示的数据,我们创建以下updateData()
方法:
public void updateData(List<StateData> newDataList) {
covidDataList.clear();
covidDataList.addAll(newDataList);
notifyDataSetChanged();
}
covidDataList
为初始传递到适配器的列表,我们现在重新添加数据并在适配器中引发视图更新。
现在,我们已经完成了应用程序的开发,现在我们可以构建和运行应用程序,观察应用程序显示印度各个州的最新COVID-19数据。
运行应用程序后,您应该会看到具有类似以下数据的RecyclerView:
Maharashtra
Total Confirmed: 3,171,974
Total Recovered: 2,837,768
Total Deaths: 56,783
Total Active: 277,423
Karnataka
Total Confirmed: 2,543,907
Total Recovered: 2,260,709
Total Deaths: 34,190
Total Active: 249,008
...
到此为止,我们已经完成了一个COVID-19 Tracker Android应用程序,该应用程序可以查看印度任何州和城市的COVID-19数据。在此过程中,我们使用了Retrofit网络库以及RecyclerView组件。
我们可以使用相同的技术来查询其他数据源并在适配器中显示数据。可以使用其他UI组件来替代RecyclerView,例如ListView或GridView,以满足特定需求。
Markdown Code片段:
```groovy
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
}
public interface CovidApi {
@GET("/data.json")
Call<CovidDataResponse> getCovidData();
}
public class CovidDataResponse {
private List<StateData> stateDataList;
// getters and setters
}
public class StateData {
private String state;
private String confirmed;
private String active;
private String recovered;
private String deaths;
// getters and setters
}
RecyclerView recyclerView = findViewById(R.id.covid_data_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
CovidDataAdapter adapter = new CovidDataAdapter(new ArrayList<>());
recyclerView.setAdapter(adapter);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.covid19india.org/state_district_wise/")
.addConverterFactory(GsonConverterFactory.create())
.build();
CovidApi covidApi = retrofit.create(CovidApi.class);
Call<CovidDataResponse> call = covidApi.getCovidData();
call.enqueue(new Callback<CovidDataResponse>() {
@Override
public void onResponse(Call<CovidDataResponse> call, Response<CovidDataResponse> response) {
CovidDataResponse covidDataResponse = response.body();
adapter.updateData(covidDataResponse.getStateDataList());
}
@Override
public void onFailure(Call<CovidDataResponse> call, Throwable t) {
Log.e(TAG, "onFailure: ", t);
}
});
@Override
public void onBindViewHolder(@NonNull CovidDataViewHolder holder, int position) {
StateData stateData = covidDataList.get(position);
holder.title.setText(stateData.getState());
holder.confirmCount.setText(stateData.getConfirmed());
holder.recoveredCount.setText(stateData.getRecovered());
holder.deathCount.setText(stateData.getDeaths());
holder.activeCount.setText(stateData.getActive());
}
public void updateData(List<StateData> newDataList) {
covidDataList.clear();
covidDataList.addAll(newDataList);
notifyDataSetChanged();
}