为了账号安全,请及时绑定邮箱和手机立即绑定

在 Android 应用中仅显示具有今天截止日期的待办事项

在 Android 应用中仅显示具有今天截止日期的待办事项

月关宝盒 2022-04-28 15:54:20
对于我的应用程序,我需要一个仅显示截止日期为今天的待办事项的功能。我是 Android Studio 和 Java 的新手,所以很遗憾我不知道如何编写这段代码。到目前为止,这是我的代码:public boolean onOptionsItemSelected(MenuItem item) {    switch (item.getIdemid()) {        case R.id.menu_dailyToDo:            showDailyTodo();            adapter.notifyDataSetChanged();            return true;       }    }}public void showDailyTodo() {    if(tvDueDate == //today) {        // code that listview items with duedate today are shown.    }}我希望有人可以帮助我找到解决此问题的方法,到目前为止我所能找到的一切都无法帮助我。编辑:在图片中你可以看到我的列表视图。日期是 ID 为 tvDueDate 的 TextView。
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

避免遗留的日期时间类

您正在使用几年前被现代java.time类取代的可怕的旧日期时间类。


LocalDate

该类LocalDate表示没有时间、没有时区或从 UTC 偏移的仅日期值。


你的ToDo类应该有一个 type 的成员变量LocalDate。以及可选的 getter 方法。


public class ToDo {

    public LocalDate whenDue ;


}

时区

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,法国巴黎午夜过后几分钟是新的一天,而魁北克蒙特利尔仍然是“昨天” 。


如果未指定时区,JVM 会隐式应用其当前默认时区。该默认值可能会在运行时(!)期间随时更改,因此您的结果可能会有所不同。最好将您想要/预期的时区明确指定为参数。


以、或等格式指定适当的时区名称。永远不要使用 2-4 个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。Continent/RegionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST


ZoneId z = ZoneId.of( "America/Montreal" ) ;  

LocalDate today = LocalDate.now( z ) ;

如果你想使用 JVM 的当前默认时区,请求它并作为参数传递。如果省略,代码会变得模棱两可,因为我们不确定您是否打算使用默认值,或者您是否像许多程序员一样没有意识到这个问题。


ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

或指定日期。您可以通过数字设置月份,1 月至 12 月的编号为 1-12。


LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

或者,更好的是,使用Month预定义的枚举对象,一年中的每个月一个。提示:Month在整个代码库中使用这些对象,而不是仅仅使用整数,以使您的代码更具自文档性、确保有效值并提供类型安全。Year&同上YearMonth。


LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

比较

LocalDate在: isEqual, isBefore, isAfter,上比较使用方法equals。


循环您的待办事项,将日期与目标、今天的日期进行比较。


ZoneId z = ZoneId.of( "Africa/Tunis" ) ;  // Or `ZoneId.systemDefault()`.

LocalDate ld = LocalDate.now( z ) ;

List< ToDo > todayToDos = new ArrayList<>() ;

for( ToDo todo : todos ) {

    if( todo.whenDue.isEqual( today ) ) {

        todayToDos.add( todo ) ;

    }

}


查看完整回答
反对 回复 2022-04-28
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您可以使用System.currentTimeMillis()long 数据类型来获取高达毫秒的当前时间。


或者


您可以使用Date d = new Date();将日期作为 Date 对象获取并将其转换为所需格式的字符串,例如


Date d = new Date();

SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");

String formattedDate = df.format(d);

这取决于您在 tvDueDate 中存储日期的数据类型和格式。


然后您可以将 Todos 项设置为 ListView 适配器,如这篇文章 Custom Adapter for List View中所示


编辑


您可以使用字符串在字符串中获取您的截止日期


String dueDate = tvDueDate.getText().toString();

然后做


public void showDailyTodo() {

Date d = new Date();

SimpleDateFormat df = new SimpleDateFormat("dd.mm.yyyy");

String formattedDate = df.format(d);

if(dueDate.equals(formattedDate)) {

    // code that listview items with duedate today are shown.

}

}


查看完整回答
反对 回复 2022-04-28
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您可以使用 android 中的 DateUtils 库来检查到期日是否是今天。


这是官方文档的链接:https://developer.android.com/reference/android/text/format/DateUtils#isToday(long)


要获取 listview 项目,只需遍历项目并检查它们的截止日期是否是今天并过滤掉项目。您可以将这些项目传递给列表视图的适配器。对于单个项目的比较,粗略的实现是:


long timeInMillis = dueDate.getTime();

if (dateUtils.isToday(timeInMillis)){

    //this is today's item, so add this to a list which is sent to the listview

}


查看完整回答
反对 回复 2022-04-28
  • 3 回答
  • 0 关注
  • 128 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信