#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. Отредактировал исходный ответ, который может решить вышеуказанные ошибки