Передача данных с помощью SharedPreferences

Я создаю в базе данных каталог с клубами, в котором должны храниться id и название клуба:

val ref = FirebaseDatabase.getInstance().reference.child("Clubs")
val clubId = ref.push().key
    
val clubMap = HashMap<String, Any>()
clubMap["clubId"] = clubId!!
clubMap["clubname"] = name_club.text.toString()          
    
ref.child(clubId).updateChildren(clubMap)

Далее все клубы я помещаю в RecyclerView. Когда я нажимаю по конкретному клубу, я должен попасть в фрагмент этого клуба, передав ему id клуба:

holder.clubLayout.setOnClickListener {

            val editor = mContext.getSharedPreferences("PREFS", Context.MODE_PRIVATE).edit()

            editor.putString("clubId", club.getClubid())
            editor.apply()

            (mContext as FragmentActivity).supportFragmentManager
                .beginTransaction()
                .replace(R.id.clubs_container, ClubFragment()).commit()
        }

И в фрагменте я получаю это id:

val preferences = context?.getSharedPreferences("PREFS", Context.MODE_PRIVATE)
if (preferences != null)
{
    clubId = preferences.getString("clubId", "none").toString()
}

Далее я хочу получить название клуба с помощью id клуба и записать его в club_fragment_club_name:

    private fun clubInfo()
    {
        val clubsRef = FirebaseDatabase.getInstance().reference.child("Clubs").child(clubId)

        clubsRef.addValueEventListener(object : ValueEventListener
        {
            @RequiresApi(Build.VERSION_CODES.O)
            override fun onDataChange(p0: DataSnapshot)
            {
                if (p0.exists())
                {
                    val club = p0.getValue<Clubs>(Clubs::class.java)

                    club_fragment_club_name.text = club!!.getClubname()
                }
            }

            override fun onCancelled(error: DatabaseError)
            {

            }
        })
    }

Но club_fragment_club_name получается пустым. То есть там нет названия клуба, он просто пустой. В чём может быть проблема?

upd: Когда я попытался id пользователя, то всё было хорошо. То есть проблема не в самой передаче информации, а в id клуба. Но я без понятия, почему это не работает.


Ответы (1 шт):

Автор решения: Andrew

Вообще на мой взгляд довольно странно использовать для передачи данных в фрагмент функционала для хранения данных приложения. Более логично как мне кажется было бы использовать Bundle в который вы будете класть ваш id. Здесь вы переходите на фрагмент:

(mContext as FragmentActivity).supportFragmentManager
                .beginTransaction()
                .replace(R.id.clubs_container, ClubFragment()).commit()

можно сделать так:

val clubFrg = ClubFragment()
clubFrg.arguments = Bundle().apply {
      putInt("clubId", club.getClubid())
}

(mContext as FragmentActivity).supportFragmentManager
                    .beginTransaction()
                    .replace(R.id.clubs_container, clubFrg ).commit()

дальше вы ловите данные в целевом фрагменте:

val clubID = arguments.getInt("clubId")

так же, если все-таки у вас не пробросятся данные, посмотрите в список через логи или отладку, точно ли там есть идентификатор.

→ Ссылка