android-studio - 如何将 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,
)
解决方案
替换以下行:
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
}
推荐阅读
- r - 循环文件!解析文件并按 IDENTIFIER 分组?
- python - 在 Python 的另一个类中直接使用或访问类实例
- android-studio - 如何将文件保存到 Android 中的下载共享文件夹
- javascript - chrome window.innerWidth 值与开发者控制台值不同
- unit-testing - 尝试使用 Argument Captor 在 Kotlin 中捕获参数时出错
- mastercard - 万事达卡托管结账集成安全
- c++ - 如何在 Qt C++ 程序中管理多个 SQLite 数据库?
- python - 如何有效地计算大量数据的距离矩阵
- javascript - 在 React 中出现错误“找不到模块的声明文件......”
- asp.net-core - 如何在 .NET Core Razor 页面中获取登录用户列表