我正在创建一个应用程序来监控我的SQL服务器的实时温度。我还使用Phil Jay的MPAndroidCharts创建了一个线图,并遇到了一个问题。
我使用X轴作为时间标签(HH:mm:ss)但是时间似乎更新了所有标签而不是最后一个标签。我尝试了很多不同的方法,但没有一种方法可行。所以我想我会请求你们帮忙。谢谢!
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();
}
}
答案 0 :(得分:0)
在代码中添加以下行:
mChart.setData(data);
mChart.notifyDataSetChanged(); // add this line
mChart.invalidate();