协程中的自定义适配器

Custom adapter in coroutine

当我尝试使用自定义适配器填充 ListView 时,我得到一个空列表,我不知道错误是什么?为什么在使用默认适配器时会加载和显示所有内容?

HeroesAdapter.kt

    class HeroesAdapter(context: Context, heroes: List<TestHero>): BaseAdapter() {
            private val context = context
            private val heroes = heroes
        
            override fun getCount(): Int {
                return heroes.count()
            }
        
            override fun getItem(position: Int): Any {
                return heroes[position]
            }
        
            override fun getItemId(position: Int): Long {
                return 0
            }
        
            override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        
                   // categoryView = LayoutInflater.from(context).inflate(R.layout.activity_heroes, null)
                val categoryView = LayoutInflater.from(context).inflate(R.layout.activity_heroes, parent, false)
                   // val categoryImage: ImageView = categoryView.findViewById(R.id.heroesImageView)
                    val categoryText: TextView = categoryView.findViewById(R.id.textHeroView)
                    val category = heroes[position]
        
                    categoryText.text = category.global.name
        
                    return categoryView
        
            }
        }

HeroesActivity

class HeroesActivity : AppCompatActivity() {

    lateinit var adapter : ArrayAdapter<TestHero>
    lateinit var adapt: ArrayAdapter<String>
    lateinit var heroesAdapt : HeroesAdapter
    var listHero = ArrayList<TestHero>()
    private val TAG = "HeroesActivity"

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



       // val adapterr = ArrayAdapter(this, android.R.layout.simple_list_item_1,)


        adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1,
            LinkedList<TestHero>())
       // heroesListView.adapter = adapter

        adapt = ArrayAdapter(this, android.R.layout.simple_list_item_1,
            LinkedList<String>())
        //heroesListView.adapter = adapt


        getCurrentData()

        heroesAdapt = HeroesAdapter(this, listHero)
        heroesListView.adapter = heroesAdapt

    }

    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){
                   // adapter.add(data.global.name)
                    adapt.add(data.global.platform)

                    listHero.add(data)

                }

            }
        }
    }
}

您似乎将数据添加到适配器的后备列表 (listHero.add(data)),但您从未通知适配器其后备数据已更改 (heroesAdapt.notifyDataSetChanged())。

顺便说一句,您的协程存在一些问题。您不应该使用 GlobalScope。请改用 lifecycleScope 以避免泄漏网络调用和 Activity 的副本。实际上,您应该使用 ViewModel 的范围在 ViewModel 中获取数据并通过 LiveData 或 SharedFlow 公开它,这样网络调用就不必在 phone 旋转时重新启动。