如何将ListView替换为RecyclerView?已编写Adapter与ViewHolder无法正常使用
ListView改造成RecyclerView的完整方案
首先明确原有代码的3个核心错误:
- CryptoAdapter中变量名引用错误:构造传入的列表命名为
crypto,但代码中错误引用了不存在的crypto1变量 - 字段映射错误:Data类中定义的交易所id字段为
exchange_id,但Adapter中错误调用了不存在的exchange字段 - MainActivity中未对RecyclerView做基础配置:没有设置LayoutManager,也没有绑定自定义的CryptoAdapter,而是直接用了ListView的ArrayAdapter
第一步:修改布局文件activity_main.xml
替换原有ListView控件为RecyclerView,示例代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
同时确认item布局item_crypto.xml中存在id为cryptoName、cryptoExchangeId、cryptoUrl的TextView控件。
第二步:修正CryptoAdapter代码
package com.example.cryptotracker import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView 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 = crypto[position] holder.cryptoName.text = current_item.name // 修正字段引用为exchange_id holder.cryptoId.text = current_item.exchange_id holder.cryptoUrl.text = current_item.website } override fun getItemCount(): Int { return crypto.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) }
第三步:修改MainActivity代码
package com.example.cryptotracker import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager 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) // 给RecyclerView设置布局管理器,必须配置,否则RecyclerView无法渲染 recyclerView.layoutManager = LinearLayoutManager(this) val rf : Retrofit = Retrofit.Builder().baseUrl(RetroInterface.BASE_URL) .addConverterFactory(GsonConverterFactory.create()).build() val API : RetroInterface = rf.create(RetroInterface::class.java) val call:Call<List<Crypto?>?>? = API.posts call?.enqueue(object :Callback<List<Crypto?>?>{ override fun onResponse( call: Call<List<Crypto?>?>, response: Response<List<Crypto?>?> ) { val postList = response.body()?.filterNotNull() ?: emptyList() // 直接使用自定义的CryptoAdapter,不需要转成String数组 val adapter = CryptoAdapter(applicationContext, postList) recyclerView.adapter = adapter } override fun onFailure(call: Call<List<Crypto?>?>, t: Throwable) { t.printStackTrace() // 可根据需求添加失败提示逻辑 } }) } }
Data类代码无需修改,直接使用原有代码即可。
内容的提问来源于stack exchange,提问作者jaggu
相关产品推荐
相关产品推荐

