Не получается отобразить все данные массива в RecyclerView

Есть адаптер такого вида

class HeroesRecyclerAdapter(val context: Context, val heroes: List<TestHero>): RecyclerView.Adapter<HeroesRecyclerAdapter.Holder>() {

    inner class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val heroesName = itemView?.findViewById<TextView>(R.id.textHeroView)

        fun bindHeroes (hero: TestHero, context: Context){
           //heroesName?.text = hero.legends.all.keys.first()
            for((key) in hero.legends.all){
                Log.d("HeroesActivity", key)
                //holder.heroesName?.text = key
                heroesName?.text = key

            }

        }

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val view = LayoutInflater.from(context).inflate(R.layout.list_hero_view, parent, false)
        return  Holder(view)
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
        holder?.bindHeroes(heroes[position], context)
    }

    override fun getItemCount(): Int {
        return heroes.count()
    }
}

при циклическом заполнении TextView данные перезаписываются и отображают только последнее значение массива, как правильно отобразить все данные в столбик из массива для дальнейшего выбора категории из списка ?

data class TestHero (@SerializedName("global") val global: PlayerInf,
                     @SerializedName("legends")val legends: AllLegends)

data class  PlayerInf (val name: String, val uid: Long, val avatar: String, val platform: String,
val  level: Int, val toNextLevelPercent: Int, val internalUpdateCount: Int, val bans: BanInf, val rank: RankInf)

data class BanInf (val isActive: Boolean, val remainingSeconds: Int)

data class RankInf (val rankScore: Int, val rankName: String, val rankDiv: Int, val rankImg: String)


data class AllLegends (@SerializedName("all") val all: Map<String, LegendWrapper> = emptyMap())


data class LegendWrapper(
    val data: List<PlayerPerformance>? = emptyList()

)
data class PlayerPerformance(val name: String, val value: Int, val key: String)

Если изменить код без использования массива, тогда я получаю все ключи в 1 поле

class TestRecyclerAdapter(val cont: Context): RecyclerView.Adapter<TestRecyclerAdapter.Holders>() {
    var heroes: List<AllLegends> = emptyList()

    inner class Holders(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val heroesName = itemView?.findViewById<TextView>(R.id.textHeroView)

        fun bindHeroes (hero: AllLegends, context: Context){
            heroesName?.text = hero.all.keys.toString()


        }
}

введите сюда описание изображения


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

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

Попробуйте так:

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is Holder -> {
                holder.bindHeroes(heroes[position])
            }
        }
    }
→ Ссылка
Автор решения: Ethernets

Решил проблему следующем путём, не знаю правда насколько это правильно, хотел бы послушать комментарии более опытных людей, ниже приведу весь код: Сам адаптер

class HeroesRecyclerAdapter(val context: Context, var heroes: ArrayList<String>): RecyclerView.Adapter<HeroesRecyclerAdapter.Holder>() {

inner class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val heroesName = itemView?.findViewById<TextView>(R.id.textHeroView)

    fun bindHeroes (heroName: String, context: Context){


        heroesName?.text = heroName
       //heroesName?.text = hero.legends.all.keys.first()
       // for((key) in hero.legends.all){
      //      Log.d("HeroesActivity", key)
            //holder.heroesName?.text = key
     //       heroesName?.text = key

     //   }

    }

}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
    val view = LayoutInflater.from(context).inflate(R.layout.list_hero_view, parent, false)
    return  Holder(view)
}

override fun onBindViewHolder(holder: Holder, position: Int) {
   holder?.bindHeroes(heroes[position], context)

}

override fun getItemCount(): Int {
    return heroes.count()
 }
}

HeroesActivity

class HeroesActivity : AppCompatActivity() {

    lateinit var heroesAdapt : HeroesRecyclerAdapter
    lateinit var testHeroesAdapt : TestRecyclerAdapter

    val listHero = ArrayList<TestHero>()
    val recList = ArrayList<String>()
    private val TAG = "HeroesActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_heroes)

        getCurrentData()

        heroesAdapt = HeroesRecyclerAdapter(this, recList)
        heroesListView.adapter = heroesAdapt

        val layoutManager = LinearLayoutManager(this)
        heroesListView.layoutManager = layoutManager


        /*
        testHeroesAdapt = TestRecyclerAdapter(this)
        heroesListView.adapter = testHeroesAdapt

        val layoutManager = LinearLayoutManager(this)
        heroesListView.layoutManager = layoutManager
      */

    }

    private fun getCurrentData() {
        val api = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiRequest::class.java)

        GlobalScope.launch(Dispatchers.IO) {
            val response = api.herList().awaitResponse()
            if (response.isSuccessful) {
                val data = response.body()!!
                Log.d(TAG, data.toString())

                withContext(Dispatchers.Main){

                    listHero.add(data)

                    heroesAdapt.apply {

                        for((key) in data.legends.all){
                            Log.d("HeroesActivity", key)
                            //holder.heroesName?.text = key
                            recList.add(key)
                        }

                        notifyDataSetChanged()
                    }



                    textNickname.text = "${data.global.name} (${data.global.rank.rankDiv} divisions)"
                    textLvl.text = "Level: ${data.global.level.toString()}"
                    when(data.global.rank.rankName){
                        "Silver" -> textNickname.setTextColor(Color.parseColor("#7A7A79"))
                        "Gold" ->   textNickname.setTextColor(Color.parseColor("#E6D600"))
                        "Platinum" -> textNickname.setTextColor(Color.parseColor("#36BBCE"))
                    }

                }

            }
        }
    }
}

Насколько правильна реализация данного участка кода, я не знаю, но результат приложу скриншотом.

 heroesAdapt.apply {

                        for((key) in data.legends.all){
                            Log.d("HeroesActivity", key)
                            //holder.heroesName?.text = key
                            recList.add(key)
                        }

                        notifyDataSetChanged()
                    }

Ребят кто знает как сделать лучше, напишите пожалуйста, не хочу учить язык сразу с ошибками. Спасибо

введите сюда описание изображения

→ Ссылка