Не получается отобразить все данные массива в 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 шт):
Попробуйте так:
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
is Holder -> {
holder.bindHeroes(heroes[position])
}
}
}
Решил проблему следующем путём, не знаю правда насколько это правильно, хотел бы послушать комментарии более опытных людей, ниже приведу весь код: Сам адаптер
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()
}
Ребят кто знает как сделать лучше, напишите пожалуйста, не хочу учить язык сразу с ошибками. Спасибо

