Как я могу отобразить имя моей цели в CalendarView? - PullRequest
0 голосов
/ 19 сентября 2019

На данный момент мне удалось добавить поле 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

Q: Как отобразить имя цели на определенную дату?

UPD: Прямо сейчася вставляю этот код в свой фрагмент, который я взял из этого ответа :

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 Ответ

1 голос
/ 19 сентября 2019

Согласно предыдущим комментариям, вы подтвердили, что хотите, чтобы кто-то нажимал на дату в календаре, чтобы запросить узел targets, используя эту дату, чтобы найти один или несколько результатов.Но обо всем по порядку.

Для целей поиска сохранение date в виде строки может работать, поскольку вы можете использовать для сравнения whereEqualTo() метод, но если вы хотите упорядочить результаты, он не будет работатьпоскольку строки упорядочены лексикографически .Так что вы можете рассмотреть вопрос о сохранении 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)
...