【问题标题】:how to change ListView to RecyclerView?如何将 ListView 更改为 RecyclerView?
【发布时间】:2021-05-29 06:43:07
【问题描述】:

虽然我创建了 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)



}

=============================数据class================= ==========

package com.example.cryptotracker

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

    )

【问题讨论】:

  • 你的问题是什么,我很困惑。你写了 convert ListView to RecyclerView 但你已经发布了一些 RecyclerView 实现代码
  • 是的!首先,我试图实现 RecyclerView,但 recyclerView 的代码不起作用。所以我尝试了listView,它成功了。我想使用recyclerView而不是listview。 @georkost

标签: android-studio kotlin android-recyclerview android-linearlayout


【解决方案1】:

替换以下行:

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
}

【讨论】:

  • 出现以下错误:Type mismatch. Required: List&lt;Crypto&gt; Found: Array&lt;String?&gt; AND Type mismatch. Required: Context Found:
  • 编辑了可能解决上述错误的原始答案
猜你喜欢
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多