我有一个SQLite数据库,其中包含许多任务以及完成这些任务的日期。然后我将这些日期作为PieEntries添加到饼图中。我想找到图表上的日期和当前日期之间的差异。
我们的想法是根据日期之间的差异为图表的不同部分设置不同的颜色。
我在这里发现了一些帖子,比如我一直在使用的这个帖子:Android difference between Two Dates。但到目前为止似乎没有任何工作。
下面是我的光标在数据库中循环并使用它来获取日期并将它们放入PieEntry List。还有我用来计算当前日期和代码的代码来计算填充图表和当前日期之间的差异。
final ArrayList<TaskObject> taskObjects = new ArrayList<>();
if (mCursor != null) {
mCursor.moveToFirst();
do {
TaskObject taskObject = new TaskObject();
taskObject.setTask(mCursor.getString(mCursor.getColumnIndex(TaskEntry.COLUMN_TASK)));
taskObject.setObserver(mCursor.getString(mCursor.getColumnIndex(TaskEntry.COLUMN_OBSERVER)));
taskObject.setDate(mCursor.getString(mCursor.getColumnIndex(TaskEntry.COLUMN_DATE)));
taskObjects.add(taskObject);
} while (mCursor.moveToNext());
float distribution = 100 / taskObjects.size();
List<PieEntry> pieEntries = new ArrayList<>();
for (int i = 0; i < taskObjects.size(); i++) {
pieEntries.add(new PieEntry(distribution, (taskObjects.get(i).getTask()) + "\n" + taskObjects.get(i).getDate()));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
String pastDateString = taskObjects.get(i).getDate();
Date currentDate = Calendar.getInstance().getTime();
Date pastDate = null;
try {
pastDate = simpleDateFormat.parse(pastDateString);
} catch (ParseException e) {
e.printStackTrace();
}
//Comparing dates
long difference = Math.abs(currentDate.getTime() - pastDate.getTime());
long differenceDates = difference / (24 * 60 * 60 * 1000);
//Convert long to String
String dayDifference = Long.toString(differenceDates);
Log.e("HERE","HERE: " + dayDifference);
}
PieDataSet pieDataSet = new PieDataSet(pieEntries, "Label");
pieDataSet.setColors(ColorTemplate.MATERIAL_COLORS);
PieData pieData = new PieData(pieDataSet);
mPieChart.setData(pieData);
mPieChart.invalidate();
}
mCursor.close();
我们的想法是从当前日期中减去过去的日期,以显示一个整数值,然后可以使用该整数值来更改饼图段的颜色。
编辑:
List<PieEntry> pieEntries = new ArrayList<>();
for (int i = 0; i < taskObjects.size(); i++) {
pieEntries.add(new PieEntry(distribution, (taskObjects.get(i).getTask()) + "\n" + taskObjects.get(i).getDate()));
mPieDataSet = new PieDataSet(pieEntries, "Versatility Matrix & Qualification Status");
String pastDateString = taskObjects.get(i).getDate();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date d = null;
try {
d = simpleDateFormat.parse(pastDateString);//catch exception
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Calendar pastDate = Calendar.getInstance();
pastDate.setTime(d);
Calendar currentDate = Calendar.getInstance();
long diff = currentDate.getTimeInMillis() - pastDate.getTimeInMillis();
long days = diff/(24*60*60*1000);
int daysDifference = (int) days;
Log.d(TAG, "days in difference = " + daysDifference);
if(daysDifference >= 90) {
mPieDataSet.setColor(Color.RED);
} else if (daysDifference < 90 && daysDifference >= 60) {
mPieDataSet.setColor(Color.YELLOW);
} else {
mPieDataSet.setColor(Color.GREEN);
}
}
PieData pieData = new PieData(mPieDataSet);
mPieChart.setData(pieData);
mPieChart.invalidate();
此新代码不会返回天数差异的整数值,并且所有图表段目前都显示为红色。
这是一个猜测:当你做mPieDataSet.setColor(Color.RED);
时,我认为你在整个馅饼上设置颜色,而不仅仅是在单个切片/馅饼条目上。这样,如果你在循环中处理的最后一个条目是90天,那么你的所有饼图都会变成红色。
我无法在您的代码中重现错误的计算,其中天数将超过90但不应该。如果我将pastDateString
设置为4/1/2019
,我会得到88天,而你的if
/ else
构造选择黄色方式。
免责声明:我不知道MPAndroidChart。
如果您的数据库具有date
数据类型,请将其用于日期。不要将它们存储为字符串。其次,考虑不使用SimpleDateFormat
,Calendar
和Date
。它们的设计很差,而且已经过时了。您可以将ThreeTenABP添加到Android项目中,并使用LocalDate
和java.time中的其他类,即现代Java日期和时间API。与它合作真是太好了。并且为计算日期之间的差异提供了更好的支持:
long days = ChronoUnit.DAYS.between(pastLocalDate, LocalDate.now(yourTimeZone));
java.time
。