我如何在 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)