全球疫情爬取及展示_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);
    }
}

  

posted @ 2020-03-27 17:32  XiaoGao128  阅读(728)  评论(0编辑  收藏  举报