Search code examples
androidkotlinandroid-recyclerviewgsonadapter

error in using Gson Api with recyclerview?


hello guys I am using a gson api with a Recyclerview and I got this error with the adapter and it says that the

expression 'myAdapter' of type 'myAdapter' cannot be invoked as a function. the function 'invoked' is not found

and when I run the code without the data it gives me this error:

lateinit property myAdapter has not been initialized

my activities and classes

private val datalist: MutableList<Sura> = mutableListOf()
private lateinit var myAdapter: MyAdapter
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_quran_a_p_i)

    myAdapter = myAdapter(datalist) // here is the error


    apiQuranRecyclerView.layoutManager = LinearLayoutManager(this)
    apiQuranRecyclerView.addItemDecoration(DividerItemDecoration(this, OrientationHelper.VERTICAL))
    apiQuranRecyclerView.adapter = myAdapter

    AndroidNetworking.initialize(this)

    AndroidNetworking.get("http://api.islamhouse.com/v1/mykey/quran/get-category/462298/ar/json/")
        .build()
        .getAsObject(Surasnames::class.java, object : ParsedRequestListener<Surasnames>{
            override fun onResponse(response: Surasnames) {
                datalist.addAll(response.suras)
                myAdapter.notifyDataSetChanged()
            }

            override fun onError(anError: ANError?) {
            }

        })


}

my Adapter

class MyAdapter (private val datalist: MutableList<Sura>): RecyclerView.Adapter<myHolder>() {

private lateinit var context: Context
override fun onCreateViewHolder(parent: ViewGroup, p1: Int): myHolder {
    context = parent.context
    return myHolder(LayoutInflater.from(context).inflate(R.layout.api_quran_view, parent, false))
}


override fun getItemCount(): Int = datalist.size


override fun onBindViewHolder(holder: myHolder, position: Int) {
    val data = datalist[position]

    val apisuraname = holder.itemView.apiSuraNames

    val surasnames = "${data.id} ${data.title}"

    apisuraname.text = surasnames


    holder.itemView.setOnClickListener {
        Toast.makeText(context, surasnames, Toast.LENGTH_SHORT).show()
    }

}

my Holder

class myHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { }

my Models

data class Sura(
@SerializedName("add_date")
val addDate: Int,
@SerializedName("api_url")
val apiUrl: String,
@SerializedName("id")
val id: Int,
@SerializedName("title")
val title: String,
@SerializedName("type")
val type: String

)

the second one

data class Surasnames(
@SerializedName("add_date")
val addDate: Int,
@SerializedName("description")
val description: String,
@SerializedName("id")
val id: Int,
@SerializedName("locales")
val locales: List<Any>,
@SerializedName("suras")
val suras: List<Sura>,
@SerializedName("title")
val title: String)

thanks in advance


Solution

  • You need to call the constructor. Change the line

    myAdapter = myAdapter(datalist)

    to

    myAdapter = MyAdapter(datalist)