首页 > 解决方案 > 如何将 ListView 更改为 RecyclerView?

问题描述

尽管我已经创建了 Adapter(RecyclerView) 和 ViewHolder(RecyclerView),但我无法使用 RecyclerView,所以我尝试使用 ListView,它对我有用。

将 ListView 转换为 RecyclerView 应该怎么做?

package com.example.cryptotracker

import android.os.Bundle
import android.util.Log
import android.widget.Adapter
import android.widget.ArrayAdapter
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class MainActivity : AppCompatActivity() {

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

        var rf : Retrofit = Retrofit.Builder().baseUrl(RetroInterface.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create()).build()

        var API : RetroInterface = rf.create(RetroInterface::class.java)
        var call:Call<List<Crypto?>?>? = API.posts

        call?.enqueue(object :Callback<List<Crypto?>?>{
            override fun onResponse(
                call: Call<List<Crypto?>?>,
                response: Response<List<Crypto?>?>
            ) {
                var postList :List<Crypto>? = response.body() as List<Crypto>
                var post : Array<String?> = arrayOfNulls<String>(postList!!.size)

                for ( i in postList!!.indices)
                    post[i] = postList!![i]!!.name

                var adapter = ArrayAdapter<String>(applicationContext,android.R.layout.simple_dropdown_item_1line,post)
                listview.adapter = adapter

            }

            override fun onFailure(call: Call<List<Crypto?>?>, t: Throwable) {
                TODO("Not yet implemented")
            }

        })

    }

}

====================== Adapter & ViewHolder(RecyclerView) ===================

package com.example.cryptotracker

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide

class CryptoAdapter(val context:Context, val crypto:List<Crypto> ):RecyclerView.Adapter<CryptoViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CryptoViewHolder {
        val view:View = LayoutInflater.from(context).inflate(R.layout.item_crypto,parent,false)
        return CryptoViewHolder(view)
    }

    override fun onBindViewHolder(holder: CryptoViewHolder, position: Int) {
        val current_item:Crypto = crypto1[position]

        holder.cryptoName.text = current_item.name
        holder.cryptoId.text = current_item.exchange
        holder.cryptoUrl.text = current_item.website
    }

    override fun getItemCount(): Int {
      return  crypto1.size
    }

}


class CryptoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    var cryptoName = itemView.findViewById<TextView>(R.id.cryptoName)
    var cryptoId = itemView.findViewById<TextView>(R.id.cryptoExchangeId)
    var cryptoUrl = itemView.findViewById<TextView>(R.id.cryptoUrl)



}

============================数据类==================== =======

package com.example.cryptotracker

data class Crypto (
    
    val exchange_id:String,
    val name:String,
    val website:String,

    )

标签: android-studiokotlinandroid-recyclerviewandroid-linearlayout

解决方案


替换以下行:

var adapter = ArrayAdapter<String>(applicationContext,android.R.layout.simple_dropdown_item_1line,post)
listview.adapter = adapter

有了这个 :

if(postList != null) {
    var cryptoAdapter = CryptoAdapter(this@MainActivity,postList)
    recyclerview.layoutManager = LinearLayoutManager(this@MainActivity)
    recyclerview.adapter = cryptoAdapter
}

也在 CryptoAdapter.kt

override fun getItemCount(): Int {
      return  crypto.size
}

推荐阅读