我如何在 CalendarView 中显示我的目标名称?
How i can display name of my target in CalendarView?
目前我设法将 date
字段添加到我的模型 Target
。
您可以在屏幕中看到的结构:
我还有一个显示日历的片段。如果为该日期创建了目标,如何通过单击日期来判断?
class CalendarFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_calendar, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupViews()
}
private fun setupViews() {
calendarView.setOnDateChangeListener { view, year, month, dayOfMonth ->
dateView.text = //name of Target
}
}
}
例如,现在我在日历中仅显示带有下一个代码的日期:
dateView.text = "Selected date is " + dayOfMonth + "/" + (month + 1) + "/" + year
问:如何显示特定日期的目标名称?
更新:
现在我将这段代码插入我的片段中,这是我从 :
中获取的
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val targetsRef = rootRef.child("targets").child("users").child(uid).child("targets")
val query = targetsRef.orderByChild("date")
val valueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (ds in dataSnapshot.children) {
val name = ds.child("name").getValue(String::class.java)
Log.d("some", name)
}
}
override fun onCancelled(databaseError: DatabaseError) {
Log.d("some", databaseError.getMessage()) //Don't ignore errors!
}
}
query.addListenerForSingleValueEvent(valueEventListener)
但是现在,当我进入片段时,无论日历中选择的日期如何,我都会得到创建的所有目标的名称。
根据之前的评论,您确认希望当有人单击日历中的某个日期时使用该日期查询 targets
节点以查找一个或多个结果。但首先是第一件事。
出于搜索目的,将 date
存储为字符串可能有效,因为您可以使用 whereEqualTo()
方法进行比较,但如果您想对结果进行排序,则无法使用,因为。因此,您可以考虑将 date
存储为 ServerValue.TIMESTAMP
,正如我在以下 post:
的回答中所解释的
此外,我将为您提供特定用途的解决方案,其中 date
是一个字符串,但如果您考虑使用上述解决方案,稍后可以简单地更改它。所以我将使用以下字符串作为选定日期:
val selectedDate = "24 October 2019"
假设此值来自您从日历中选择的日期,请尝试以下代码:
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val targetsRef = rootRef.child("targets").child("users").child(uid).child("targets")
val query = targetsRef.orderByChild("date").equalTo(selectedDate)
val valueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (ds in dataSnapshot.children) {
val name = ds.child("name").getValue(String::class.java)
Log.d(TAG, name)
}
}
override fun onCancelled(databaseError: DatabaseError) {
Log.d(TAG, databaseError.getMessage()) //Don't ignore errors!
}
}
query.addListenerForSingleValueEvent(valueEventListener)
在这种情况下,您的 logcat 中的结果将是:
target
编辑:
I get the names of all the targets created regardless of the selected date in the calendar.
你得到了所有的日期,因为你忘了打电话给 .equalTo(selectedDate)
。所以请更改:
val query = targetsRef.orderByChild("date")
至
val query = targetsRef.orderByChild("date").equalTo(selectedDate)
目前我设法将 date
字段添加到我的模型 Target
。
您可以在屏幕中看到的结构:
我还有一个显示日历的片段。如果为该日期创建了目标,如何通过单击日期来判断?
class CalendarFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_calendar, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupViews()
}
private fun setupViews() {
calendarView.setOnDateChangeListener { view, year, month, dayOfMonth ->
dateView.text = //name of Target
}
}
}
例如,现在我在日历中仅显示带有下一个代码的日期:
dateView.text = "Selected date is " + dayOfMonth + "/" + (month + 1) + "/" + year
问:如何显示特定日期的目标名称?
更新:
现在我将这段代码插入我的片段中,这是我从
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val targetsRef = rootRef.child("targets").child("users").child(uid).child("targets")
val query = targetsRef.orderByChild("date")
val valueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (ds in dataSnapshot.children) {
val name = ds.child("name").getValue(String::class.java)
Log.d("some", name)
}
}
override fun onCancelled(databaseError: DatabaseError) {
Log.d("some", databaseError.getMessage()) //Don't ignore errors!
}
}
query.addListenerForSingleValueEvent(valueEventListener)
但是现在,当我进入片段时,无论日历中选择的日期如何,我都会得到创建的所有目标的名称。
根据之前的评论,您确认希望当有人单击日历中的某个日期时使用该日期查询 targets
节点以查找一个或多个结果。但首先是第一件事。
出于搜索目的,将 date
存储为字符串可能有效,因为您可以使用 whereEqualTo()
方法进行比较,但如果您想对结果进行排序,则无法使用,因为date
存储为 ServerValue.TIMESTAMP
,正如我在以下 post:
此外,我将为您提供特定用途的解决方案,其中 date
是一个字符串,但如果您考虑使用上述解决方案,稍后可以简单地更改它。所以我将使用以下字符串作为选定日期:
val selectedDate = "24 October 2019"
假设此值来自您从日历中选择的日期,请尝试以下代码:
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val targetsRef = rootRef.child("targets").child("users").child(uid).child("targets")
val query = targetsRef.orderByChild("date").equalTo(selectedDate)
val valueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
for (ds in dataSnapshot.children) {
val name = ds.child("name").getValue(String::class.java)
Log.d(TAG, name)
}
}
override fun onCancelled(databaseError: DatabaseError) {
Log.d(TAG, databaseError.getMessage()) //Don't ignore errors!
}
}
query.addListenerForSingleValueEvent(valueEventListener)
在这种情况下,您的 logcat 中的结果将是:
target
编辑:
I get the names of all the targets created regardless of the selected date in the calendar.
你得到了所有的日期,因为你忘了打电话给 .equalTo(selectedDate)
。所以请更改:
val query = targetsRef.orderByChild("date")
至
val query = targetsRef.orderByChild("date").equalTo(selectedDate)