双折线图的数据分页显示

基于MpandroidChart的开源图表,前面文章有,地址:http://blog.csdn.net/zhangli_/article/details/50171047

这篇博客主要是记录我这两天被这个分页的逻辑困扰的问题,今天终于解决了,先记录下来,怕以后在遇到这样的问题。

但是这个逻辑很固定,图表数据是固定的5个点,想要修改的话,需要测试一下,但原理还是一样的。

先看效果:



布局:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/xiaye_button"
        android:text="下一页" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/shangye_button"
        android:text="上一页" />

</LinearLayout>

<com.github.mikephil.charting.charts.LineChart
    android:id="@+id/chart"
    android:layout_margin="5dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

代码:

从服务器获取数据的可以不用管,我这里是获取到的数据放在新的list中,然后再从各个list去得到。

package com.officialcar.offcialvehicles.ui.statistics;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import com.github.mikephil.charting.utils.ViewPortHandler;
import com.google.gson.Gson;
import com.officialcar.offcialvehicles.AppConfig;
import com.officialcar.offcialvehicles.R;
import com.officialcar.offcialvehicles.domian.User;
import com.officialcar.offcialvehicles.domian.Youhao.ListBean;
import com.officialcar.offcialvehicles.domian.Youhao.YouhaoBean;

import org.kymjs.kjframe.KJHttp;
import org.kymjs.kjframe.http.HttpCallBack;
import org.kymjs.kjframe.http.HttpConfig;
import org.kymjs.kjframe.http.HttpParams;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class YouhaoActivity extends AppCompatActivity implements View.OnClickListener {

    HttpParams params;
    String qian_time;
    String date;
    String str;
    private User user;
    private LineChart mChart;
    //5.16 暂定为5条数据
    private int page_data = 5;
    private int my_min = 0;
    private int youhao = 0;
    private int km_num = 0;
    private String shang = "shang";
    private String xia = "xia";

    private int my_len;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_youhao_layout);

        mChart = (LineChart) findViewById(R.id.chart);

        ImageView title_img = (ImageView) findViewById(R.id.titlbar_img);
        title_img.setOnClickListener(this);
        TextView title_text = (TextView) findViewById(R.id.titlebar_text_title);
        title_text.setText("油耗统计");

        Button shangye_button = (Button) findViewById(R.id.shangye_button);
        shangye_button.setOnClickListener(this);
        Button xiaye_button = (Button) findViewById(R.id.xiaye_button);
        xiaye_button.setOnClickListener(this);

        user = User.getInstance1();
        user.setListNull();

        params = new HttpParams();

        Intent intent = getIntent();
        qian_time = intent.getStringExtra("QIAN_TIME");
        date = intent.getStringExtra("DANG_TIME");

        getData();
    }

    /**
     * 获取到数据
     */
    
    public void getData() {
        
        HttpConfig httpConfig = new HttpConfig();
        httpConfig.cacheTime = 0;//设置缓存时间
        KJHttp http = new KJHttp(httpConfig);

        params.put("startoilWearCar_time", qian_time);
        params.put("endoilWearCar_time", date);
        params.put("carId", "");
        params.put("car_num_arr", 0);
        params.put("className", "com.ycya.service.ReportService");
        params.put("methodName", "queryOilWear1");

        http.post(AppConfig.MY_URL, params, new HttpCallBack() {
            @Override
            public void onSuccess(Map<String, String> headers, byte[] t) {
                super.onSuccess(t);
                Log.e("tag", "onSuccess");
                try {
                    str = new String(t, "gbk");
                    Log.e("tag", "str:" + str);
                    setUserList(str);
                } catch (Exception e) {
                    Log.e("tag", "e:" + e);
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(int errorNo, String strMsg) {
                super.onFailure(errorNo, strMsg);
                Log.e("tag", "errorNo:" + errorNo);
                Log.e("tag", "onFailure");
            }
        });
    }

    private void setUserList(String str) {
        Gson gson = new Gson();
        YouhaoBean data = gson.fromJson(str, YouhaoBean.class);
        List<ListBean> datalist = data.getList();
        //往User里添加数据
        for (ListBean list : datalist) {
            //油耗
            double oil = list.getOil();
            user.getList_oil().add(oil);
            //里程
            double km = list.getKm();
            user.getList_km().add(km);
            //车牌号
            String car_num = list.getCarnum();
            user.getList_car_num().add(car_num);
        }
        setChartdata();
    }
    //取油耗最高值  给图表
    public double getOilMax(){
        double kk = user.getList_oil().get(0);
        for(int i=1;i<user.getList_oil().size();i++){
            if(kk<user.getList_oil().get(i)){
                kk = user.getList_oil().get(i);
            }
        }
        return kk;
    }
    //取里程最高值  给图表
    public double getKMMax(){
        double kk = user.getList_km().get(0);
        for(int i=1;i<user.getList_km().size();i++){
            if(kk<user.getList_km().get(i)){
                kk = user.getList_km().get(i);
            }
        }
        return kk;
    }


    public void setChartdata() {
        //在这里面添加图表的数据
        setChart(mChart);
        // 制作5个数据点。
        setData(mChart, page_data, xia);
        Legend l = mChart.getLegend();
        l.setForm(Legend.LegendForm.LINE);
        l.setTextSize(11f);
        l.setTextColor(Color.BLACK);
        l.setPosition(Legend.LegendPosition.BELOW_CHART_CENTER);
        XAxis xAxis = mChart.getXAxis();
        // 将X坐标轴的标尺刻度移动底部。
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        // X轴之间数值的间隔
        xAxis.setSpaceBetweenLabels(1);
        xAxis.setTextSize(9f);
        xAxis.setTextColor(Color.BLACK);
        YAxis leftAxis = mChart.getAxisLeft();
        setYAxisLeft(leftAxis);
        YAxis rightAxis = mChart.getAxisRight();
        setYAxisRight(rightAxis);
    }

    private void setChart(LineChart mChart) {
        mChart.setDescription("");
        //setNoDataTextDescription
        mChart.setNoDataTextDescription("非常抱歉,这个时间段没有数据");
        mChart.setNoDataText("");
        mChart.setTouchEnabled(true);
        mChart.setDragDecelerationFrictionCoef(0.9f);
        mChart.setDragEnabled(true);
        mChart.setScaleEnabled(true);
        mChart.setDrawGridBackground(true);
        mChart.setHighlightPerDragEnabled(true);
        mChart.setPinchZoom(true);
        mChart.setBackgroundColor(Color.LTGRAY);
        mChart.animateX(3000);
    }

    private void setYAxisLeft(YAxis leftAxis) {
        // 在左侧的Y轴上标出4个刻度值
        leftAxis.setLabelCount(5, true);
        // Y坐标轴轴线的颜色
        leftAxis.setGridColor(Color.RED);
        // Y轴坐标轴上坐标刻度值的颜色
        leftAxis.setTextColor(Color.RED);
        // Y坐标轴最大值
        leftAxis.setAxisMaxValue((float) (getKMMax()+100));
        // Y坐标轴最小值
        leftAxis.setAxisMinValue(0);
        leftAxis.setStartAtZero(true);
        leftAxis.setDrawLabels(true);
    }

    private void setYAxisRight(YAxis rightAxis) {
        // Y坐标轴上标出8个刻度值
        rightAxis.setLabelCount(3, true);
        // Y坐标轴上刻度值的颜色
        rightAxis.setTextColor(Color.BLUE);
        // Y坐标轴上轴线的颜色
        rightAxis.setGridColor(Color.BLUE);
        // Y坐标轴最大值
        rightAxis.setAxisMaxValue((float)(getOilMax()+100));
        // Y坐标轴最小值
        rightAxis.setAxisMinValue(0);
        rightAxis.setStartAtZero(true);
        rightAxis.setDrawLabels(true);
    }

    private void setData(LineChart mChart, int count, String biaoshi) {
        ArrayList<String> xVals = new ArrayList<>();
        for (int i = my_min; i < count; i++) {
            xVals.add(user.getList_car_num().get(i));
        }
        ArrayList<Entry> yHigh = new ArrayList<>();
        LineDataSet high = new LineDataSet(yHigh, "里程(km)");
        setHighTemperature(high, yHigh, biaoshi);
        ArrayList<Entry> yLow = new ArrayList<>();
        LineDataSet low = new LineDataSet(yLow, "油耗(L)");
        setLowTemperature(low, yLow, biaoshi);
        ArrayList<ILineDataSet> dataSets = new ArrayList<>();
        dataSets.add(high);
        dataSets.add(low);
        LineData data = new LineData(xVals, dataSets);
        data.setValueTextColor(Color.DKGRAY);
        data.setValueTextSize(10f);
        mChart.setData(data);
    }

    private void setHighTemperature(LineDataSet high, ArrayList<Entry> yVals, String biaoshi) {
        int len = page_data;
        if (biaoshi.equals(shang)) {
            if (my_len < 5) {
                km_num = km_num - 5 - my_len;
            } else {
                km_num = km_num - 10;
            }
            int currIndex = my_min + 5;
            if (currIndex >= user.getList_km().size()) {
                len = user.getList_km().size() % page_data;
                if(len==0){
                    len=page_data;
                }
            }
        }
        for (int i = 0; i < len; i++) {
            double km = user.getList_km().get(km_num);
            km_num++;
            if (km_num >= user.getList_km().size()) {
                len = user.getList_km().size() % page_data;
                if(len==0){
                    len=page_data;
                }
            }
            my_len = len;
            yVals.add(new Entry((float) km, i));
        }
        // 以左边的Y坐标轴为准
        high.setAxisDependency(YAxis.AxisDependency.LEFT);
        high.setLineWidth(5f);
        high.setColor(Color.RED);
        high.setCircleSize(8f);
        high.setCircleColor(Color.YELLOW);
        high.setCircleColorHole(Color.DKGRAY);
        high.setDrawCircleHole(true);

        // 设置折线上显示数据的格式。如果不设置,将默认显示float数据格式。
        high.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float v, Entry entry, int i, ViewPortHandler viewPortHandler) {
                DecimalFormat decimalFormat = new DecimalFormat(".0");
                String s = "里程" + decimalFormat.format(v);
                return s;
            }
        });
    }

    private void setLowTemperature(LineDataSet low, ArrayList<Entry> yVals, String biaoshi) {
        int len = page_data;
        if (biaoshi.equals(shang)) {
            if (my_len < 5) {
                youhao = youhao - 5 - my_len;
            } else {
                youhao = youhao - 10;
            }
            int currIndex = my_min + 5;
            if (currIndex > user.getList_km().size()) {
                len = user.getList_oil().size() % page_data;
                if(len==0){
                    len=page_data;
                }
            }
        }
        for (int i = 0; i < len; i++) {
            if (youhao < 0) {
                youhao = 0;
            }
            double oil = user.getList_oil().get(youhao);
            youhao++;
            if (youhao >= user.getList_km().size()) {
                len = user.getList_km().size() % page_data;
                if(len==0){
                    len=page_data;
                }
            }
            my_len = len;
            yVals.add(new Entry((float) oil, i));
        }
        // 以右边Y坐标轴为准
        low.setAxisDependency(YAxis.AxisDependency.RIGHT);
        // 折现的颜色
        low.setColor(Color.GREEN);
        // 线宽度
        low.setLineWidth(3f);
        // 折现上点的圆球颜色
        low.setCircleColor(Color.BLUE);
        // 填充圆球中心部位洞的颜色
        low.setCircleColorHole(Color.LTGRAY);
        // 圆球的尺寸
        low.setCircleSize(5f);
        low.setDrawCircleHole(true);
        low.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float v, Entry entry, int i, ViewPortHandler viewPortHandler) {
                DecimalFormat decimalFormat = new DecimalFormat(".0");
                String s = "油耗" + decimalFormat.format(v);
                return s;
            }
        });
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.titlbar_img:
                finish();
                break;
            case R.id.shangye_button:
                if (my_min == 0) {
                    Toast.makeText(getApplication(), "已经是第一页", Toast.LENGTH_SHORT).show();
                    break;
                }
                int my_min3 = my_min;
                my_min = my_min - 5;
                setData(mChart, my_min3, shang);
                mChart.invalidate();
                break;
            case R.id.xiaye_button:
                my_min = my_min + 5;
                if (my_min >= user.getList_car_num().size()) {
                    Toast.makeText(getApplication(), "已经是最后一页", Toast.LENGTH_SHORT).show();
                    my_min = my_min - 5;
                    break;
                }
                int my_min2 = my_min + 5;
                if (my_min2 >= user.getList_car_num().size()) {
                    my_min2 = user.getList_car_num().size();
                }
                setData(mChart, my_min2, xia);
                mChart.invalidate();
                break;
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值