我能够使用可滚动的日历制作应用程序,如图像:
2016年的日历本身如下:
这是一个基于五周的日历,为了它的目的,它意味着要像这样构建。 当您运行应用程序时,您有一个日历,显示一周左右。然后您可以滚动日期并查看整个日历。几个月的名字仍然在左边。 单击箭头会更新日历,按预期显示过去和未来年份。
有效。
我仍然不了解很多java,但我可以设法让它工作。 这里有一个搜索,另一个搜索,一个教程,另一个代码示例......
有效。
问题是:更新日历的速度太慢了。 更新日期大约需要3秒左右,您无法在此期间滚动日历。 更新后滚动是正常的。你左右走。没问题。 它是更新所有那些杀死我的TextView的过程...是的,我确实有很多TextViews,而且我觉得我可以开始得到一些帮助。
日历设计为显示五周,星期一到星期日,每月给我35个TextViews ...这是420个TextViews ... 以下方法在更新之前清除日历:
public void Clears_the_Calendar() {
int iId;
TextView tvDay;
for (iId = 0; iId < 420; iId++) {
tvDay= (TextView)findViewById(iarrTextView_Days_ids[iId]);
tvDay.setText(" ");
}
}
如您所见,我使用数组iarrTextView_Days_ids来引用TextViews。它看起来像:
int[] iarrTextView_Days_ids = new int[]
{R.id.M01_D01, R.id.M01_D02, ... , R.id.M01_D34, R.id.M01_D35,
R.id.M02_D01, R.id.M02_D02, ... , R.id.M02_D34, R.id.M02_D35,
.
.
.
R.id.M12_D01, R.id.M12_D02, ... , R.id.M12_D34, R.id.M12_D35}
这就是我用来构建日历的方法:
private void mtBuild_Calendar(int iYear, int iColumn) {
int i, iId, iDay, iMonth1, iMonth2, iTotal_Days;
TextView tvDay;
Date dtDate = null;
int iRight_Column = 35;
String sDay, sDate = "01/01/" + iYear;
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Calendar cMain_Calendar = Calendar.getInstance();
Calendar cAuxiliary_Calendar = Calendar.getInstance();
try {
dtDate = sdf.parse(sDate);
cMain_Calendar.setTime(dtDate);
cAuxiliary_Calendar.setTime(dtDate);
} catch (ParseException e) {
e.printStackTrace();
}
cMain_Calendar.setTime(dtDate);
cAuxiliary_Calendar.setTime(dtDate);
Clears_the_Calendar();
// displays "1" (jan/1), according to iColumn, which is determined in another method:
iId = iColumn - 1;
tvDay = (TextView)findViewById(iarrTextView_Days_ids[iId]);
tvDay.setText("1");
// It's not important to be extremely precise about leap years:
if ((iYear % 4) == 0) {
iTotal_Days = 366;
} else {
iTotal_Days = 365
}
for (i = 1; i < iTotal_Days - 1; i++) {
// Adds a day to the cAuxiliary_Calendar and compares its MONTH with the previous day from cMain_Calendar
cAuxiliary_Calendar.add(Calendar.DATE, 1);
iMonth1 = cMain_Calendar.get(Calendar.MONTH);
iMonth2 = cAuxiliary_Calendar.get(Calendar.MONTH);
// Performs the comparisons needed to change the months:
if (iColumn < iRight_Column) {
if (iMonth2 == iMonth1) {
iColumn = iColumn + 1;
iId = iId + 1;
} else {
iColumn = iColumn + 1;
iId = iId + 36;
}
} else {
if (iMonth2 == iMonth1) {
iColumn = 1;
iId = iId - 34;
} else {
iColumn = 1;
iId = iId + 1;
}
}
// Adds a day to cMain_Calendar and displays it in the proper place according to iId:
cMain_Calendar.add(Calendar.DATE, 1);
iDay = cMain_Calendar.get(Calendar.DAY_OF_MONTH);
sDay = Integer.toString(iDay);
tvDay = (TextView) findViewById(iarrTextView_Days_ids[iId]);
tvDay.setText(sDay);
}
}
首先,一个方法清除所有420个TextView,然后只满足当年所需的365或366。 不过,这还有很多工作......今天下午我开始看看canvas.drawText 在我看来它会更快,因为我理解TextView在其核心内使用canvas。但我甚至找不到一种方法来制作一个简单的canvas.drawText来在ScrollView中工作。 所以问题是:
我应该使用canvas.drawText而不是TextViews吗?我怎样才能做到这一点? 或者,有没有其他更快的方式来显示应用程序应该做的365个数字?
(新信息,不知道它看起来如何......) 尝试新的thigs: 也许我误解了适配器可以做什么,但是对于我所学到的东西它不会帮助我...因为每年一次完全加载到视图中,滚动日历没有延迟。问题是当我想从一年换到另一年时刷新所有365个TextView需要多长时间。事实上,我可以设法将此延迟减少到不到1秒,因为我最终遵循Android Studio关于太多嵌套权重的建议。所有我的TextViews在其样式上使用该attibute。我将它们全部删除,让权重仅用于LinearLayouts。
现在我一直试图找到一种方法将字符串传递给可以在视图中绘制文本的方法。我仍然无法在ScrollView中使用drawText,因为我找不到调用它的方法。在我看来,它只能在onDraw中工作,onDraw仅在我加载视图时触发。但是我需要让drawText完成420次工作(当我清除日历时)以及显示新日历时的365次。 我是否应该在ScrollView中加载800个视图,每次我想要查看年份???
我还将主要的LinearLayout更改为RelativeLAyout,但事情变得奇怪,因为我必须设置很多高度(在更改之前为0dp),现在我在从纵向更改为横向时遇到了麻烦......但这是一个小问题。