如何让MPAndroidCharts仅更新最后一个X轴?

时间:2018-01-13 18:31:48

标签: java android linechart

我正在创建一个应用程序来监控我的SQL服务器的实时温度。我还使用Phil Jay的MPAndroidCharts创建了一个线图,并遇到了一个问题。

我使用X轴作为时间标签(HH:mm:ss)但是时间似乎更新了所有标签而不是最后一个标签。我尝试了很多不同的方法,但没有一种方法可行。所以我想我会请求你们帮忙。谢谢!

Image of isue here

package com.example.boiijek.myapplication;

import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
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.TextView;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
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.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.utils.ColorTemplate;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import static com.example.boiijek.myapplication.SettingsActivity.PREFS_NAME;
public class MainActivity extends AppCompatActivity {
    final Context context = this;
    String setno, checkinglux, checkingtemp;
    Button testbutton;



    /**
     * Created by Boiijek on 21/10/2017.
     */

    TextView textalertsends, tempalertsends, luxalertsends, luxupdate, tempupdate;
    BroadcastReceiver updateUIReceiver;


    public static final String EXTRA_TEMP = "temp_extra";

    private ArrayList<Entry> entries = new ArrayList<>();


    LineChart mChart;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_profile);

        mChart = findViewById(R.id.chart);
        XAxis xAxis = mChart.getXAxis();
        xAxis.setValueFormatter(createDateFormatter());
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        mChart.getAxisLeft().setDrawGridLines(false);
        mChart.getXAxis().setDrawGridLines(false);
        mChart.getAxisLeft().setDrawAxisLine(false);
        mChart.getXAxis().setTextColor(Color.CYAN);
        mChart.getAxisLeft().setTextColor(Color.CYAN);  // left y-axis
        mChart.getLegend().setTextColor(Color.YELLOW);
        mChart.getAxisRight().setEnabled(false);
        YAxis yAxis = mChart.getAxisLeft();
        yAxis = mChart.getAxisRight();
        yAxis.setDrawGridLines(false);

        Description description = new Description();
        description.setTextColor(ColorTemplate.VORDIPLOM_COLORS[2]);
        description.setText("Live Temperature Data");
        mChart.setDescription(description);




        setYAxisValues();
       // setData();

        SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
        setno = settings.getString("finalno", "NULL");
        checkinglux = settings.getString("checkingtemp", "99999");
        checkingtemp = settings.getString("checkingtemp", "0");
        textalertsends = (TextView) findViewById(R.id.textalertsends);
        tempalertsends = (TextView) findViewById(R.id.tempalertsends);
        luxalertsends = (TextView) findViewById(R.id.luxalertsends);


        textalertsends.setText("SMS Alerts will be sent to " + setno);
        tempalertsends.setText("Alerted when Temp. is over " + checkingtemp + "°C");
        luxalertsends.setText("Alerted when Lux is below " + checkinglux + " lux");
        testbutton = (Button) findViewById(R.id.button55);


        {
            if (isMyServiceRunning() == false) {
                testbutton.setBackgroundColor(Color.GREEN);
                testbutton.setTextColor(Color.BLACK);
                testbutton.setText("Start Background Monitoring");
            } else {
                testbutton.setBackgroundColor(Color.RED);
                testbutton.setText("Stop Background Monitoring");

            }
        }


        testbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                if (isMyServiceRunning() == true) {
                    Intent intent = new Intent(MainActivity.this, TimeService.class);
                    stopService(intent);
                    testbutton.setBackgroundColor(Color.GREEN);
                    testbutton.setTextColor(Color.BLACK);
                    testbutton.setText("Start Background Monitoring");
                } else {
                    Intent intent = new Intent(MainActivity.this, TimeService.class);
                    startService(intent);
                    testbutton.setBackgroundColor(Color.RED);
                    testbutton.setText("Stop Background Monitoring");


                }
            }

        });

        IntentFilter filter = new IntentFilter();

        filter.addAction("com.example.nihal.myapplication.UPDATE_DATA");

        updateUIReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {

                //UI update here
                int temp = intent.getIntExtra(EXTRA_TEMP, 0);



                entries.remove(0);
                Calendar c = Calendar.getInstance();
                int mseconds = c.get(Calendar.MILLISECOND);
                entries.add(new Entry(mseconds, temp));
                setData();


            }
        };
        registerReceiver(updateUIReceiver, filter);

    }

    final String[] quarters = new String[] { "Q1", "Q2", "Q3", "Q4" };


    IAxisValueFormatter createDateFormatter() {
        IAxisValueFormatter formatter = new IAxisValueFormatter() {
            @Override


            public String getFormattedValue(float value, AxisBase axis) {

                Date date = new Date((long) value);

                SimpleDateFormat sdfDate = new SimpleDateFormat("HH:mm:ss");
                Date now = new Date();
                String strDate = sdfDate.format(now);


                Log.d("test", strDate);


                return strDate ;

            }

            public int getDecimalDigits() {
                return 0;
            }

        };

        return formatter;
    }



    private void setYAxisValues() {
        entries.add(new Entry(0, 60));
        entries.add(new Entry(1, 48));
        entries.add(new Entry(2, 70.5f));
        entries.add(new Entry(3, 100));
        entries.add(new Entry(4, 180.9f));
        entries.add(new Entry(5, 210f)); //test

    }

    private ArrayList<String> setXAxisValues() {
        ArrayList<String> xVals = new ArrayList<String>();
        xVals.add("10");
        xVals.add("20");
        xVals.add("30");
        xVals.add("30.5");
        xVals.add("40");
        xVals.add("50");  //test

        return xVals;
    }

    private void setData() {
        ArrayList<String> xVals = setXAxisValues();

        LineDataSet set1;

        set1 = new LineDataSet(entries, "X Axis - Time // Y Axis - Temp");
        set1.setFillAlpha(110);

        set1.setColor(Color.WHITE);
        set1.setCircleColor(Color.WHITE);
        set1.setLineWidth(1f);
        set1.setCircleRadius(3f);
        set1.setDrawCircleHole(false);
        set1.setValueTextSize(9f);
        set1.setValueTextColor(Color.WHITE);
        set1.setDrawFilled(true);
        set1.setCubicIntensity(0.5f);
        set1.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);




        // create a data object with the datasets
        LineData data = new LineData(set1);


        // set data
        mChart.setData(data);
        mChart.invalidate();


    }



    public void startService(View view) {
        Intent intent = new Intent(this, TimeService.class);
        startService(intent);
    }

    public void stopService(View view) {
        Intent intent = new Intent(this, TimeService.class);
        stopService(intent);

    }

    private boolean isMyServiceRunning() {
        ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (TimeService.class.getName().equals(service.service.getClassName())) {
                return true;
            }
        }
        return false;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(updateUIReceiver);
    }

    @Override
    public void onBackPressed() {
        finish();
        super.onBackPressed();
    }

}

1 个答案:

答案 0 :(得分:0)

在代码中添加以下行:

    mChart.setData(data);
    mChart.notifyDataSetChanged(); // add this line
    mChart.invalidate();