I am currently working on a project that requires a search feature that retrieves JSON data from a website. The app is supposed to display that data using a RecyclerView. However, Android studio refuses to accept my dataset into the recyclerview adapter. My deserialized JSON data is coming in the form of a List and is deserialized using the KotlinX serializer.
data class searchResults(@SerialName("name") val name: String,
@SerialName("description") val description: String,
@SerialName("website") val website: String )
val query = Query(searchBox.getText().toString())
val result = index.search(query)
val searchObject: List<searchResults> =
result.hits.deserialize(searchResults.serializer())
adapter = resultsAdapter(searchObject)
recyclerView.adapter = adapter
<code>@Serializable
data class searchResults(@SerialName("name") val name: String,
@SerialName("description") val description: String,
@SerialName("website") val website: String )
val query = Query(searchBox.getText().toString())
val result = index.search(query)
val searchObject: List<searchResults> =
result.hits.deserialize(searchResults.serializer())
adapter = resultsAdapter(searchObject)
recyclerView.adapter = adapter
</code>
@Serializable
data class searchResults(@SerialName("name") val name: String,
@SerialName("description") val description: String,
@SerialName("website") val website: String )
val query = Query(searchBox.getText().toString())
val result = index.search(query)
val searchObject: List<searchResults> =
result.hits.deserialize(searchResults.serializer())
adapter = resultsAdapter(searchObject)
recyclerView.adapter = adapter
However, the adapter insists on taking the searchResults deserializer data class with it in the space that it would normally take the ViewHolder data class.
<code>class resultsAdapter(var searchObject: List<searchResults>) : RecyclerView.Adapter<resultsAdapter.resultsViewHolder>(){
inner class resultsViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
val name: TextView = itemView.findViewById(R.id.nameResult)
val description: TextView = itemView.findViewById(R.id.descriptionResult)
val website: TextView = itemView.findViewById(R.id.websiteResult)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): resultsViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.rowlayout, parent, false)
return resultsViewHolder(view)
override fun getItemCount(): Int {
override fun onBindViewHolder(holder: resultsViewHolder, position: Int) {
val currentItem = searchObject[position]
holder.name.text = currentItem.name
holder.description.text = currentItem.description
holder.website.text = currentItem.website
<code>class resultsAdapter(var searchObject: List<searchResults>) : RecyclerView.Adapter<resultsAdapter.resultsViewHolder>(){
inner class resultsViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
val name: TextView = itemView.findViewById(R.id.nameResult)
val description: TextView = itemView.findViewById(R.id.descriptionResult)
val website: TextView = itemView.findViewById(R.id.websiteResult)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): resultsViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.rowlayout, parent, false)
return resultsViewHolder(view)
}
override fun getItemCount(): Int {
return searchObject.size
}
override fun onBindViewHolder(holder: resultsViewHolder, position: Int) {
val currentItem = searchObject[position]
holder.name.text = currentItem.name
holder.description.text = currentItem.description
holder.website.text = currentItem.website
}
}
</code>
class resultsAdapter(var searchObject: List<searchResults>) : RecyclerView.Adapter<resultsAdapter.resultsViewHolder>(){
inner class resultsViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
val name: TextView = itemView.findViewById(R.id.nameResult)
val description: TextView = itemView.findViewById(R.id.descriptionResult)
val website: TextView = itemView.findViewById(R.id.websiteResult)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): resultsViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.rowlayout, parent, false)
return resultsViewHolder(view)
}
override fun getItemCount(): Int {
return searchObject.size
}
override fun onBindViewHolder(holder: resultsViewHolder, position: Int) {
val currentItem = searchObject[position]
holder.name.text = currentItem.name
holder.description.text = currentItem.description
holder.website.text = currentItem.website
}
}
From reading documentation online I believe the ViewHolder data class is supposed to be initialized in the results Adapter. It should say “List ViewHolder” instead of “List searchResults” during the variable initialization, however, whenever I try to implement that change I am thrown an error saying:
<code>Type mismatch.
Required:
List<resultsData>
Found:
List<searchResults>
</code>
Type mismatch.
Required:
List<resultsData>
Found:
List<searchResults>
What is the correct way to do this?