全球疫情爬取及展示_app
效果图:

疫情数据爬取:https://www.cnblogs.com/XiaoGao128/p/12576648.html
设计思路
从服务器端请求数据,在客户端进行展示。客户端负责发送请求参数,服务端进行处理,访问数据库然后返回参数。
客户端
1、通过HttpUrlConnection的方式向服务器端发送请求,返回json数组,进行解析得到所需数据列表,通过调用下面这个工具类中的getList函数获取数据。
public class JsonParse {
/**
* 解析Json数据
*
* @param urlPath
* @return mlists
* @throws Exception
*/
public static List<ProvinceBean> getList(String urlPath) throws Exception {
List<ProvinceBean> mlists = new ArrayList<ProvinceBean>();
byte[] data = readParse(urlPath);
Log.d("-------------------",data.toString());
JSONArray array = new JSONArray(new String(data));
for (int i = 0; i < array.length(); i++) {
JSONObject item = array.getJSONObject(i);
String state=item.getString("state");
String name=item.getString("name");
String confirm=item.getString("confirm");
String current=item.getString("current");
String suspect=item.getString("suspect");
String cured=item.getString("cured");
String dead=item.getString("dead");
String date=item.getString("date");
mlists.add(new ProvinceBean(state,name,confirm,current,suspect,cured,dead,date));
}
return mlists;
}
/**
* 从指定的url中获取字节数组
*
* @param urlPath
* @return 字节数组
* @throws Exception
*/
public static byte[] readParse(String urlPath) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
Log.d("111",urlPath);
conn.setRequestMethod("POST");
// conn.s
InputStream inStream = conn.getInputStream();
Log.d("222",urlPath);
while ((len = inStream.read(data)) != -1) {
outStream.write(data, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}
2、传递参数
这里我设置了三个筛选按钮,分别注册contextmenu,用于筛选国际、国内的疫情并提供排序。默认显示当天的疫情数据,如需要,也可在一旁进行查询,如下图。
菜单中每个按钮被点击之后都会重新请求数据并刷新图表,通过改变url后缀来附带参数。



3、数据显示
数据显示用了一个recycleview和MPAndroid图表。
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MainRecyAdapter adapter;
private List<ProvinceBean> list = null;
private PopupMenu pop_out, pop_in, pop_order;
private Button btn_out, btn_in, btn_order, btn_query;
private String nowout = "国际", nowin = "省份", noworder = "currentt";
private boolean nowwhat = true;
private EditText et_query;
private boolean is_out = false, is_in = false, is_order = false;
private ProgressBar progressBar;
public ArrayList<BarEntry> entries ;
public BarDataSet dataset;
public ArrayList<String> labels;
private BarChart barChart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
refreshList("http://123.56.137.134/CollectDataA/GiveData?posi=contury&date=alldate&order=" + noworder + "&state=allstate");
}
@Override
protected void onResume() {
super.onResume();
}
private void initViews() {
// barchart=findViewById(R.id.barchart);
// initChartAction();
barChart=findViewById(R.id.barchart);
progressBar=findViewById(R.id.main_prog);
recyclerView = findViewById(R.id.main_recy);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
adapter = new MainRecyAdapter(list, MainActivity.this);
recyclerView.setAdapter(adapter);
btn_out = findViewById(R.id.main_expand_order_out);
btn_in = findViewById(R.id.main_expand_order_in);
btn_order = findViewById(R.id.main_expand_order_by);
btn_out.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!is_out) {
initPop_out();
} else {
pop_out.show();
}
}
});
btn_in.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!is_in) {
initPop_in();
} else {
pop_in.show();
}
}
});
btn_order.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!is_order){
initPop_order();
}else {
pop_order.show();
}
}
});
et_query = findViewById(R.id.et_query);
btn_query = findViewById(R.id.btn_query);
btn_query.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String now;
if (nowwhat) {
now = "contury";
} else {
now = nowin;
}
String url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=" + et_query.getText().toString() + "&order=" + noworder + "&state=allstate";
refreshList(url);
}
});
}
private void initPop_out() {
is_out = true;
pop_out = new PopupMenu(MainActivity.this, btn_out);
pop_out.getMenuInflater().inflate(R.menu.menu_out, pop_out.getMenu());
pop_out.show();
pop_out.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
progressBar.setVisibility(View.VISIBLE);
nowwhat = true;
btn_out.setText(item.getTitle());
String url = "http://123.56.137.134/CollectDataA/GiveData?posi=contury&date=alldate&state=" + item.getTitle() + "&order=" + noworder;
refreshList(url);
return true;
}
});
}
private void initPop_order() {
is_order = true;
pop_order = new PopupMenu(MainActivity.this, btn_order);
pop_order.getMenuInflater().inflate(R.menu.menu_order, pop_order.getMenu());
pop_order.show();
pop_order.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
progressBar.setVisibility(View.VISIBLE);
btn_order.setText(item.getTitle());
String url = "";
String now;
if (nowwhat) {
now = "contury";
} else {
now = nowin;
}
switch (item.getItemId()) {
case R.id.noww: {
url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=alldate&order=currentt" + "&state=allstate";
noworder = "current";
break;
}
case R.id.confirmm: {
url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=alldate&order=confirmm" + "&state=allstate";
noworder = "confirm";
break;
}
case R.id.curedd: {
url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=alldate&order=cured" + "&state=allstate";
noworder = "cured";
break;
}
case R.id.deadd: {
url = "http://123.56.137.134/CollectDataA/GiveData?posi=" + now + "&date=alldate&order=dead" + "&state=allstate";
noworder = "dead";
break;
}
}
refreshList(url);
return true;
}
});
}
private void initPop_in() {
is_in = true;
pop_in = new PopupMenu(MainActivity.this, btn_in);
pop_in.getMenuInflater().inflate(R.menu.menu_in, pop_in.getMenu());
pop_in.show();
pop_in.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
progressBar.setVisibility(View.VISIBLE);
nowwhat = false;
btn_in.setText(item.getTitle());
btn_in.setText(item.getTitle());
if (item.getItemId()==R.id.province) {
String url = "http://123.56.137.134/CollectDataA/GiveData?posi=province&date=alldate&order=" + noworder + "&state=allstate";
nowin = "province";
refreshList(url);
} else {
String url = "http://123.56.137.134/CollectDataA/GiveData?posi=city&date=alldate&order=" + noworder + "&state=allstate";
nowin = "city";
refreshList(url);
}
return true;
}
});
}
private void refreshList(String url) {
//获取数据
new Thread(new Runnable() {
@Override
public void run() {
try {
list = JsonParse.getList(url);
Message message = new Message();
message.what = 1;
Log.d("----------",url);
handler.sendMessage(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
Log.d("---------","1");
recyclerView.setAdapter(new MainRecyAdapter(list, MainActivity.this));
progressBar.setVisibility(View.INVISIBLE);
initEntriesData();
show();
}
}
};
private void initEntriesData() {
entries=new ArrayList<>();
for (int i=0;i<list.size();i++){
if (i>=100) break;
switch (noworder){
case "currentt":{
entries.add(new BarEntry(i,Float.parseFloat(list.get(i).getCurrent())));
break;
}
case "confirmm":{
entries.add(new BarEntry(i,Float.parseFloat(list.get(i).getConfirm())));
break;
}
case "cured":{
entries.add(new BarEntry(i,Float.parseFloat(list.get(i).getCured())));
break;
}
case "dead":{
entries.add(new BarEntry(i,Float.parseFloat(list.get(i).getDead()),i));
break;
}
}
}
}
public void show() {
dataset = new BarDataSet(entries, "# of Calls");
dataset.setColors(ColorTemplate.COLORFUL_COLORS);
BarData data = new BarData(dataset);
barChart.setData(data);
// chart.animateXY(5000,5000);
// chart.animateX(5000);
// initLableData();
// barChart.setBackgroundColor(Color.WHITE);
// barChart.set
barChart.animateY(2000);
barChart.setTouchEnabled(true); // 设置是否可以触摸
barChart.setDragEnabled(true);// 是否可以拖拽
barChart.setScaleEnabled(true);// 是否可以缩放
barChart.setPinchZoom(true);//y轴的值是否跟随图表变换缩放;如果禁止,y轴的值会跟随图表变换缩放
barChart.setDrawGridBackground(true);// 是否显示表格颜色
barChart.setGridBackgroundColor(Color.TRANSPARENT);// 表格的的颜色
barChart.animateY(1000, Easing.Linear);//设置动画
barChart.setExtraBottomOffset(5f);//防止底部数据显示不完整,设置底部偏移量
XAxis xAxis = barChart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setTextSize(10f);
xAxis.setTextColor(Color.RED);
xAxis.setDrawAxisLine(true);
xAxis.setDrawGridLines(false);
// 设置定制的数据格式
ValueFormatter formatter = new ValueFormatter() {
// @Override
// public String getFormattedValue(float value, AxisBase axis) {
//
// }
@Override
public String getFormattedValue(float value) {
Log.d("TAG", "--------->getFormattedValue: " + value);
//设置 xAxis.setGranularity(1);后 value是从0开始的,每次加1,
int v = (int) value;
if (v <= list.size()&&v<=100&& v >= 0) {
String st = list.get(v).getName();
String tim1 = "";
tim1 = st;
return tim1;
} else {
return null;
}
}
};
xAxis.setValueFormatter(formatter);
}
}
浙公网安备 33010602011771号