访问云服务器的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>
最后的实现结果: