问题
I'm trying to show date time on X-Axis for my bar chart. I got this data from my UNIX timestamp firebase database. I have been trying to convert this UNIX timestamp to a human-readable date and then show this on my Axis. From what I know, BarEntry constructor doesn't support data type like String. So, I should use xAxis.setValueFormatter() to show the date. I have tried to use a formatter but it seems wrong like overlaps chart and the X-Axis showing incorrect results. Here is my formatter:
public class FooFormatter extends ValueFormatter {
private long referenceTimestamp; // minimum timestamp
private DateFormat mDataFormat;
private Date mDate;
public FooFormatter(long referenceTimestamp) {
this.referenceTimestamp = referenceTimestamp;
this.mDataFormat = new SimpleDateFormat( "HH:mm", Locale.ENGLISH );
this.mDate = new Date();
}
@Override
public String getFormattedValue(float value) {
// convertedTimestamp = originalTimestamp - referenceTimestamp
long convertedTimestamp = (long) value;
// Retrieve original timestamp
long originalTimestamp = referenceTimestamp + convertedTimestamp;
// Convert timestamp
return getDateString(originalTimestamp);
}
private String getDateString(long timestamp) {
try {
mDate.setTime(timestamp * 1000);
return mDataFormat.format(mDate);
} catch(Exception ex) {
return "xx";
}
}
}
this is my method for data retrieval:
public void retrievedata() {
weightReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
int count_test = 1;
ArrayList<BarEntry> dataValue = new ArrayList<BarEntry>();
if(dataSnapshot.hasChildren()){
for (DataSnapshot myDataSnapshot : dataSnapshot.getChildren()){
datapoint DataPoint = myDataSnapshot.getValue(datapoint.class);
originalTimestamp = DataPoint.getDate();
dataValue.add(new BarEntry(originalTimestamp, DataPoint.getValue()));
referenceTimestamp = 1587772800;
convertedTimestamp = originalTimestamp - referenceTimestamp;
}
showChart(dataValue);
} else {
chart.clear();
chart.invalidate();
}
}
and this is how do I use the xAxis formatter:
FooFormatter axisValueFormatter = new FooFormatter(convertedTimestamp);
XAxis xAxis = chart.getXAxis();
xAxis.setValueFormatter(axisValueFormatter);
resource: https://github.com/PhilJay/MPAndroidChart/issues/789#issuecomment-241507904
回答1:
I added an index for x values as I said 0,1,3,4,5.. Then I created a list for the dates.
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
int count_test = 1;
int index = 0;
ArrayList<BarEntry> dataValue = new ArrayList<BarEntry>();
ArrayList<Long> dateList = new ArrayList< Long >();
if(dataSnapshot.hasChildren()){
for (DataSnapshot myDataSnapshot : dataSnapshot.getChildren()){
datapoint DataPoint = myDataSnapshot.getValue(datapoint.class);
originalTimestamp = DataPoint.getDate();
dataValue.add(new BarEntry(index, DataPoint.getValue()));
referenceTimestamp = 1587772800;
convertedTimestamp = originalTimestamp - referenceTimestamp;
dateList.add(convertedTimestamp);
index++;
}
showChart(dataValue, dateList);
} else {
chart.clear();
chart.invalidate();
}
}
I changed the formatter to use the dateList:
public class FooFormatter extends ValueFormatter {
private ArrayList<Long> dateList; // minimum timestamp
private DateFormat mDataFormat;
private Date mDate;
public FooFormatter(ArrayList<Long> dateList) {
dateList = dateList;
this.mDataFormat = new SimpleDateFormat( "HH:mm", Locale.ENGLISH );
this.mDate = new Date();
}
@Override
public String getFormattedValue(float value) {
if((int) value < 0 || (int)(value) > longArrayList.size() -1)
return "";
// Retrieve original timestamp
long originalTimestamp = dateList(((int)value));
// Convert timestamp
return getDateString(originalTimestamp);
}
private String getDateString(long timestamp) {
try {
mDate.setTime(timestamp * 1000);
return mDataFormat.format(mDate);
} catch(Exception ex) {
return "xx";
}
}
}
axisValueFormatter
FooFormatter axisValueFormatter = new FooFormatter(dateList);
来源:https://stackoverflow.com/questions/61667774/how-to-set-string-value-of-date-time-on-xaxis-barchart-mpandroidchart