

訪問雲服務器的mysql實現數據的獲取。最后通過柱形圖的形式將數據顯示在頁面上;
遇到的主要困難時對於雲服務器的mysql連接本地的navicat之間事情,最后通過網上的各種解決辦法完成了相關的內容。具體的實現代碼如下:
package com.example.yiqingw; public class City { private String confirm,heal,dead,name; public String getHeal() { return heal; } public String getDead() { return dead; } public String getName() { return name; } public String getConfirm() { return confirm; } public void setConfirm(String confirm) { this.confirm = confirm; } public void setHeal(String heal) { this.heal = heal; } public void setDead(String dead) { this.dead = dead; } public void setName(String name) { this.name = name; } public City(String confirm, String heal, String dead, String name) { this.confirm = confirm; this.heal = heal; this.dead = dead; this.name = name; } public City(){} @Override public String toString() { return "City{" + "confirm='" + confirm + '\'' + ", heal='" + heal + '\'' + ", dead='" + dead + '\'' + ", name='" + name + '\'' + '}'; } }
然后main方法:
package com.example.yiqingw; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.os.Bundle; import android.util.EventLogTags; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.github.mikephil.charting.components.Description; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.BarData; import com.github.mikephil.charting.data.BarDataSet; import com.github.mikephil.charting.data.BarEntry; import com.github.mikephil.charting.formatter.IndexAxisValueFormatter; import com.google.gson.Gson; import com.github.mikephil.charting.charts.BarChart; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity{ //android:networkSecurityConfig="@xml/network_security_config" private String way=""; private String key=""; private String data=""; private Button chaxun; private EditText key1,date1; private List<City> cityList = new ArrayList<City>(); private BarChart barChart; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); chaxun=(Button)findViewById(R.id.chaxun); key1=(EditText)findViewById(R.id.key); date1=(EditText)findViewById(R.id.data); barChart=(BarChart)findViewById(R.id.wen1); String[] ctype = new String[]{"國家", "省份", "城市"}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ctype); //創建一個數組適配器 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); //設置下拉列表框的下拉選項樣式 final Spinner spinner = super.findViewById(R.id.spinner); spinner.setAdapter(adapter); //讓第一個數據項已經被選中 spinner.setSelection(0, true); //給Spinner添加事件監聽 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { //當選中某一個數據項時觸發該方法 /* * parent接收的是被選擇的數據項所屬的 Spinner對象, * view參數接收的是顯示被選擇的數據項的TextView對象 * position接收的是被選擇的數據項在適配器中的位置 * id被選擇的數據項的行號 */ @Override public void onItemSelected(AdapterView<?> parent, View view,int position, long id) { //System.out.println(spinner==parent);//true //System.out.println(view); //String data = adapter.getItem(position);//從適配器中獲取被選擇的數據項 //String data = list.get(position);//從集合中獲取被選擇的數據項 way = (String)spinner.getItemAtPosition(position);//從spinner中獲取被選擇的數據 // Toast.makeText(MainActivity.this, way, Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub } }); chaxun.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(way.equals("國家")) { way="getInfoByCountry"; } else if(way.equals("城市")) { way="getInfoByName"; } else if(way.equals("省份")) { way="getInfoByProvince"; } else { way = ""; } key=String.valueOf(key1.getText().toString().trim()); data=String.valueOf(date1.getText().toString()); if(key.equals("")||data.equals("")) { Toast.makeText(MainActivity.this,"請填寫齊全",Toast.LENGTH_SHORT).show(); } else { key1.setText("中國"); date1.setText("2020-02-18"); key="中國"; data="2020-03-18"; way="getInfoByCountry"; String url = "http://117.50.96.227/EpidemicInfo/city/" + way + "/" + key + "/" + data; RequestQueue queue = Volley.newRequestQueue(MainActivity.this); // Toast.makeText(getActivity(),url,Toast.LENGTH_SHORT).show(); StringRequest stringRequest = new StringRequest(StringRequest.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { Gson gson = new Gson(); Type cityType = new TypeToken<ArrayList<City>>() { }.getType(); cityList = gson.fromJson(response, cityType); Toast.makeText(MainActivity.this, cityList.get(0).getName(),Toast.LENGTH_SHORT).show(); barChart.setNoDataText("暫無內容"); barChart.clear(); showMyView(cityList); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("myTAG", "onErrorResponse: " + error); } }); queue.add(stringRequest); } } }); } private void showMyView(List<City> cityList) { //chart的設計 Description description = new Description(); description.setText("該頁面數據僅供參考"); barChart.setNoDataText("沒有數據!"); barChart.setDescription(description); barChart.setDrawBorders(false); barChart.setBackgroundColor(Color.WHITE); barChart.setDrawGridBackground(false); barChart.setDrawBarShadow(false); barChart.setHighlightFullBarEnabled(false); barChart.setDragEnabled(true); barChart.setNoDataText("正在加載數據..."); //X軸數據 ArrayList<BarEntry> entries_all = new ArrayList<>(); ArrayList<BarEntry> entries_cure = new ArrayList<>(); ArrayList<BarEntry> entries_dead = new ArrayList<>(); for (int i = 0; i < cityList.size(); i++) { entries_all.add(new BarEntry(i, Float.parseFloat(cityList.get(i).getConfirm()))); entries_cure.add(new BarEntry(i, Float.parseFloat(cityList.get(i).getHeal()))); entries_dead.add(new BarEntry(i, Float.parseFloat(cityList.get(i).getDead()))); } List<String> citiesName = new ArrayList<>(); for (int i = 0; i < cityList.size(); i++) { citiesName.add(cityList.get(i).getName()); } //X軸設計 XAxis xAxis = barChart.getXAxis(); xAxis.setAxisMinimum(0f); xAxis.setAxisMaximum(cityList.size()); xAxis.setValueFormatter(new IndexAxisValueFormatter(citiesName)); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setDrawAxisLine(false); xAxis.setLabelCount(cityList.size()); xAxis.setCenterAxisLabels(true); //Y軸的設計 YAxis rightY = barChart.getAxisRight(); YAxis leftY = barChart.getAxisLeft(); rightY.setEnabled(false); leftY.setEnabled(false); BarDataSet barDataSet_all = new BarDataSet(entries_all, "確診人數"); barDataSet_all.setColor(Color.RED); BarDataSet barDataSet_cure = new BarDataSet(entries_cure, "治愈人數"); barDataSet_cure.setColor(Color.GREEN); BarDataSet barDataSet_dead = new BarDataSet(entries_dead, "死亡人數"); barDataSet_dead.setColor(Color.GRAY); BarData barData = new BarData(); barData.addDataSet(barDataSet_all); barData.addDataSet(barDataSet_cure); barData.addDataSet(barDataSet_dead); barData.setBarWidth(0.3f); barData.groupBars(0f, 0.1f, 0f); barChart.setData(barData); } }
最后的布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="疫情柱形圖顯示" android:layout_marginTop="5dp" android:textSize="30dp" android:textColor="@color/lanse" android:layout_marginBottom="20dp" android:gravity="center_horizontal"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorAccent" android:layout_marginLeft="70dp" android:textSize="20dp" android:text="請選擇類別:"/> <Spinner android:layout_width="wrap_content" android:layout_marginLeft="20dp" android:layout_height="wrap_content" android:id="@+id/spinner"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorAccent" android:layout_marginLeft="70dp" android:textSize="20dp" android:text="輸入日期:"/> <EditText android:id="@+id/data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/colorPrimaryDark" android:layout_marginLeft="10dp" android:hint="yyyy-MM-dd" android:textSize="20dp" android:text=""/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="70dp" android:text="輸入關鍵字:" android:textColor="@color/colorAccent" android:textSize="20dp" /> <EditText android:id="@+id/key" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:hint="請輸入" android:text="" android:textColor="@color/colorPrimaryDark" android:textSize="20dp" /> <Button android:id="@+id/chaxun" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginLeft="20dp" android:background="@color/danlan" android:text="查詢" android:textSize="30dp" /> </LinearLayout> <com.github.mikephil.charting.charts.BarChart android:id="@+id/wen1" android:layout_width="match_parent" android:layout_height="400dp" android:layout_gravity="center_vertical"> </com.github.mikephil.charting.charts.BarChart> </LinearLayout>
最后的實現結果:
