You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 09:15:04