Обновить текущий элемент списка - PullRequest
1 голос
/ 21 марта 2019

Я открываю элемент списка, получаю данные в fetchData(), затем ожидаю, что при вызове метода addTarget() я обновлю текущий элемент (name и description). Вместо этого я создаю новый.

В: Как я могу обновить текущий?

enter image description here

class TargetEditFragment : Fragment() {

private var nameEditText: TextInputEditText? = null
private var descriptionEditText: TextInputEditText? = null
private var button: Button? = null
private var databaseReference: DatabaseReference? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.getString(KEY_TARGET_GUID, "")
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment_target_add, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    databaseReference = FirebaseDatabase.getInstance().getReference("targets")
    setupViews()
    fetchData(guid = arguments?.getString(KEY_TARGET_GUID, "") ?: "")
}

private fun setupViews() {
    nameEditText = view?.findViewById(R.id.nameEditText)
    descriptionEditText = view?.findViewById(R.id.descriptionEditText)

    button = view?.findViewById(R.id.addNote)
    button?.setOnClickListener { addTarget() }
}

private fun addTarget() {
    val name = nameEditText?.text.toString().trim()
    val description = descriptionEditText?.text.toString().trim()

    if (!TextUtils.isEmpty(name)) {
        val id: String = databaseReference?.push()?.key.toString()
        val target = Target(guid = id, name = name, description = description)
        databaseReference?.child(id)?.setValue(target)
    } else Log.d("some", "Enter a name")
}

private fun fetchData(guid: String) {
    // Attach a listener to read the data at the target id
    databaseReference?.child(guid)?.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            val data = dataSnapshot.value as HashMap<String, String>
            val name = data["name"] ?: ""
            val description = data["description"] ?: ""

            if (name.isEmpty()) Log.d("some", "nameIsEmpty")
            else {
                updateViewsContent(name = name, description = description)
            }
        }

        override fun onCancelled(p0: DatabaseError) {
            Log.d("some", "onCancelled")
        }
    })
}

private fun updateViewsContent(name: String?, description: String?) {
    nameEditText?.text = Editable.Factory.getInstance().newEditable(name)
    descriptionEditText?.text = Editable.Factory.getInstance().newEditable(description)
}

companion object {

    fun newInstance(guid: String): TargetEditFragment =
        TargetEditFragment().apply {
            arguments = Bundle().apply { putString(KEY_TARGET_GUID, guid) }
        }
}
}

1 Ответ

1 голос
/ 21 марта 2019

Нет способа обновить элемент, используя метод push(), потому что каждый раз, когда вы вызываете этот метод, генерируется новый уникальный ключ.Чтобы выполнить обновление, вам необходимо знать ключ элемента, который вы хотите обновить, и использовать его в своей ссылке.Для получения дополнительной информации, пожалуйста, смотрите мой ответ из следующего поста:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...