📜  如何创建一个COVID-19 Tracker Android应用程序以查看印度任何城市和州的详细信息?(1)

📅  最后修改于: 2023-12-03 15:38:10.067000             🧑  作者: Mango

如何创建一个COVID-19 Tracker Android应用程序以查看印度任何城市和州的详细信息?

在本教程中,我们将使用Android Studio创建一个COVID-19跟踪器应用程序,该应用程序将向用户提供印度各州和城市的最新COVID-19数据。

前置知识
  • Java编程语言
  • Android Studio集成开发环境(IDE)
  • 基本Android开发概念
开始开发
步骤1 - 创建项目

首先,在Android Studio中创建一个新项目。选择“Empty Activity”作为项目模板。

步骤2 - 设置依赖

在项目级别的build.gradle文件中添加以下依赖:

dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
}

这些依赖项将使我们能够使用Retrofit网络库来请求API,并将响应反序列化为Java对象。

步骤3 - 创建API

现在,我们需要创建一个用于获取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是一个我们将编写的类,该类描述了响应数据的结构。

步骤4 - 创建数据模型

为了反序列化从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类中。

步骤5 - 创建UI

现在,我们需要为应用程序创建用户界面。对于这个例子,我们将使用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数据列表。

步骤6 - 请求API

在应用程序启动时,我们应该在后台发出异步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。

步骤7 - 更新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为初始传递到适配器的列表,我们现在重新添加数据并在适配器中引发视图更新。

步骤8 - 运行应用程序

现在,我们已经完成了应用程序的开发,现在我们可以构建和运行应用程序,观察应用程序显示印度各个州的最新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();
}