如何在CalendarView中显示目标的名称?

时间:2019-09-19 12:20:20

标签: android firebase kotlin firebase-realtime-database calendar

此刻,我设法将date字段添加到模型Target中。 您可以在屏幕上看到的结构:

enter image description here

我还有一个片段在其中显示日历。如何通过单击日期来判断是否有针对该日期创建的目标?

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

enter image description here

问:如何显示特定日期的目标名称?

UPD: 现在,我将这段代码插入片段中,该片段是我从answer中提取的:

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)

但是现在当我进入片段时,无论日历中选择的日期如何,我都会获得创建的所有目标的名称。

1 个答案:

答案 0 :(得分:1)

根据之前的评论,您确认有人在日历中单击某个日期以使用该日期查询targets节点以查找一个或多个结果时需要。但首先要注意。

出于搜索目的,可以将date作为字符串存储,因为您可以使用比较whereEqualTo()方法,但是如果要对结果进行排序,则自{{ 3}}。因此,您可以考虑将date作为ServerValue.TIMESTAMP存储,如以下帖子中我的回答所述:

此外,我将为您提供特定用途的解决方案,其中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

编辑:

  

无论日历中选择的日期如何,我都会获得创建的所有目标的名称。

您得到所有​​日期,因为您忘记了致电.equalTo(selectedDate)。所以请更改:

val query = targetsRef.orderByChild("date")

val query = targetsRef.orderByChild("date").equalTo(selectedDate)