效果图:
疫情数据爬取: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); } }