как изменить ListView на RecyclerView?

#android-studio #kotlin #android-recyclerview #android-linearlayout

Вопрос:

Я не могу использовать RecyclerView, хотя я создал адаптер(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")
            }

        })

    }

}

 

====================== Адаптер и держатель для просмотра(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,

    )
 

Комментарии:

1. В чем ваш вопрос, я в замешательстве. Вы пишете преобразовать ListView в RecyclerView, но вы уже опубликовали некоторый код реализации RecyclerView

2. да! Во-первых, я пытался реализовать RecyclerView, но код для RecyclerView не работал. Поэтому я попробовал ListView, и это сработало. Я хочу использовать RecyclerView вместо listview. @georkost

Ответ №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
}
 

Комментарии:

1. Возникают следующие ошибки: Type mismatch. Required: List<Crypto> Found: Array<String?> И Type mismatch. Required: Context Found:

2. Отредактировал исходный ответ, который может решить вышеуказанные ошибки