DanielDev33
DanielDev33

Reputation: 1

Android Kotlin app RecyclerView Showing Nothing, Adapter Not Working, No errors

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

Answers (2)

ror
ror

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

Saurabh Mourya
Saurabh Mourya

Reputation: 41

Did you try calling the notifyDataSetChanged() after updating the list in the adapter? Seems the adapter is not refreshed.

Upvotes: 0

Related Questions