Reputation: 1
I'm trying an Api with a simple MVP Kotlin app and I do everything for it, I receive the list of coins in the Adapter but when I do a Log in bind() It doesn't show to me any error and app runs well but without any item. I have a similar app with the same code but it works well so I don't know what to do. I bring you my code, thanks!
MainActivity:
class MainActivity : AppCompatActivity(),
CoinsView {
lateinit var presenter: MainPresenter
lateinit var numAdapter: MainAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val remoteRepository = RemoteRepoCalls(RetrofitFactory.getCoinApi())
presenter = MainPresenter(
this,
remoteRepository
)
recyclerViewMain.layoutManager = LinearLayoutManager(this)
recyclerViewMain.setHasFixedSize(true)
numAdapter = MainAdapter()
recyclerViewMain.adapter = numAdapter
presenter.getMonedas("3")
}
override fun showData(result: List<Coins>) {
//numAdapter.getData(result)
numAdapter.getData(result)
}
}
MainAdapter:
class MainAdapter: RecyclerView.Adapter<MainAdapter.ViewHolder>() {
var listNums : List<Coins> = listOf<Coins>()
fun getData(list: List<Coins>) {
listNums = list
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainAdapter.ViewHolder {
return ViewHolder.from(parent)
}
//Tamaño lista
override fun getItemCount(): Int = listNums.size
//Nos pasa cada dato de la lista segun posicion
override fun onBindViewHolder(holder: MainAdapter.ViewHolder, position: Int) {
holder.bind(listNums[position])
}
//Rellena la vista con cada dato
class ViewHolder private constructor(view: View): RecyclerView.ViewHolder(view) {
private val coinNames = view.findViewById<TextView>(R.id.coinName)
private val coinSymbol = view.findViewById<TextView>(R.id.coinSymbol)
//private val imageItem1 = view.findViewById<ImageView>(R.id.imageItem)
fun bind(coinss : Coins) {
coinNames.text = coinss.name
coinSymbol.text = coinss.symbol
//Picasso.get().load(coinss.thumbnail).into(imageItem1)
}
companion object {
fun from(parent: ViewGroup): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)
return ViewHolder(view)
}
}
}
}
MainPresenter:
class MainPresenter(
private val view: CoinsView,
private val remoteRepository: RemoteRepository,
private val mainDispatcher: CoroutineDispatcher = Dispatchers.Main,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) {
fun getMonedas(limite: String) {
CoroutineScope(ioDispatcher).launch {
var resultado = remoteRepository.getCoins(limite)
withContext(mainDispatcher) {
view.showData(resultado)
}
}
}
}
interface CoinsView {
fun showData(result : List<Coins>)
}
CoinRanking.kt:
interface CoinRanking {
@GET("coins")
suspend fun getAll(): Response <EveryData>
}
object RetrofitFactory {
const val BASE_URL = "https://api.coinranking.com/v1/public/"
fun getCoinApi(): CoinRanking {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(MoshiConverterFactory.create())
.build().create(CoinRanking::class.java)
}
}
Coins Model:
data class Coins (
var symbol: String,
var name: String,
var iconUrl: String,
var price: String
)
AppPhoto: Under tittle should show the recycler with coins items
Upvotes: 0
Views: 1797
Reputation: 3500
I suggest to change this line:
var listNums : List<Coins> = listOf<Coins>()
into this:
val listNums : ArrayList<Coins> = arrayListOf<Coins>()
Then also change this method (please rename it to something more reflecting its nature) :
fun getData(list: List<Coins>) {
listNums.clear()
listNums.addAll(list)
notifyDataSetChanged()
}
Upvotes: 0
Reputation: 41
Did you try calling the notifyDataSetChanged() after updating the list in the adapter? Seems the adapter is not refreshed.
Upvotes: 0