Hovhannes
07/14/2021, 6:47 AM{
"users": [
{
"id": "1",
"name": "Bill Roy",
},
{
"id": "2",
"name": "Ben Bush",
},
{
"id": "3",
"name": "Dan Fox",
},
]
}
User.kt
data class User(
@Json(name = "id")
val id: Int = 0,
@Json(name = "name")
val name: String = ""
)
data class UserResponse(
@Json(name = "users")
val userList: List<User>
)
MainViewModel.kt
class MainViewModel(
private val mainRepository: MainRepository,
private val networkHelper: NetworkHelper
) : ViewModel() {
private val _users = MutableLiveData<Resource<UserResponse>>()
val users: LiveData<Resource<UserResponse>>
get() = _users
init {
fetchUsers()
}
private fun fetchUsers() {
viewModelScope.launch {
_users.postValue(Resource.loading(null))
if (networkHelper.isNetworkConnected()) {
mainRepository.getUsers().let {
if (it.isSuccessful) {
_users.postValue(Resource.success(it.body()))
} else _users.postValue(Resource.error(it.errorBody().toString(), null))
}
} else _users.postValue(Resource.error("No internet connection", null))
}
}
}
MainAdapter.kt
class MainAdapter(
private val users: ArrayList<User>
) : RecyclerView.Adapter<MainAdapter.DataViewHolder>() {
class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(user: User) {
itemView.textViewUserName.text = user.name
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
DataViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_layout, parent,
false
)
)
override fun getItemCount(): Int = users.size
override fun onBindViewHolder(holder: DataViewHolder, position: Int) =
holder.bind(users[position])
fun addData(list: User) {
users.addAll(listOf(list))
}
}
MainActivity.kt
private fun setupObserver() {
mainViewModel.users.observe(this, Observer {
when (it.status) {
Status.SUCCESS -> {
progressBar.visibility = View.GONE
it.data?.let { users -> renderList(users) }
recyclerView.visibility = View.VISIBLE
}........
}
private fun renderList(users: User) {
adapter.addData(users)
adapter.notifyDataSetChanged()
}
Luis
07/14/2021, 8:24 AMrenderList()
it should be renderList(response: UserResponse)
instead of what you haveHovhannes
07/14/2021, 10:12 AMLuis
07/14/2021, 11:58 AMUserResponse
with a userList
property. The type coming from your response is UserResponse
and the type your adapter needs is List<User>
Luis
07/14/2021, 12:00 PMrenderList()
method, so Kotlin type checker is telling you that you can give UserResponse
to something expecting User
Luis
07/14/2021, 12:01 PMrenderList(response: UserResponse)
and then you need to pass `response.userList`to the adapterHovhannes
07/14/2021, 12:19 PMMainAdapter.kt
class MainAdapter(
private val users: ArrayList<User>
) : RecyclerView.Adapter<MainAdapter.DataViewHolder>() {
class DataViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(user: User) {
itemView.textViewUserName.text = user.name
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
DataViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.item_layout, parent,
false
)
)
override fun getItemCount(): Int = users.size
override fun onBindViewHolder(holder: DataViewHolder, position: Int) =
holder.bind(users[position])
fun addData(list: List<User>) {
users.addAll(list)
}
}
MainActivity.kt
private fun setupObserver() {
mainViewModel.users.observe(this, Observer {
when (it.status) {
Status.SUCCESS -> {
progressBar.visibility = View.GONE
it.data?.let {userResponse -> renderList(userResponse)}
recyclerView.visibility = View.VISIBLE
}........
}
private fun renderList(users: UserResponse) {
adapter.addData(users.userList)
adapter.notifyDataSetChanged()
}
Luis
07/14/2021, 12:46 PMHovhannes
07/14/2021, 1:02 PMLuis
07/14/2021, 11:03 PMLuis
07/14/2021, 11:05 PMHovhannes
07/15/2021, 7:35 AM