Untitled

mail@pastecode.io avatar
unknown
kotlin
2 years ago
3.6 kB
2
Indexable
Never
// View Model
class UserViewModel : ViewModel() {

    val userList = MutableLiveData<List<User>>()
    private var userLiveData: MutableLiveData<List<User>>? = MutableLiveData()

    fun getUsers(): LiveData<List<User>>? {
        userLiveData = getUsersApiCall()
        return userLiveData
    }
    
    fun getUsersApiCall(): MutableLiveData<List<User>> {
        val call = RetrofitService.apiInterface.getUsers()
        call.enqueue(object : Callback<List<User>> {
            override fun onResponse(
                call: Call<List<User>>,
                response: Response<List<User>>
            ) {
                if (response.isSuccessful) {
                    userList.postValue(response.body())
                }
            }

            override fun onFailure(call: Call<List<User>>, t: Throwable) {
                Toast.makeText(Application.appContext, t.message, Toast.LENGTH_LONG).show()
            }
        })
        return userList
    }
}

// Activity (Untuk fragment juga hampir sama)
class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var userViewModel: UserViewModel
    private val listUserAdapter by lazy { ListUserAdapter(this) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        showLoading(true)
        setupRecyclerView()

        userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)
        userViewModel.getUsers()?.observe(this, getListUserObserver)
    }

    private val getListUserObserver: Observer<List<User>> =
        Observer { users ->
            showNotFound(false)
            users?.let { listUserAdapter.setData(it) }
            showLoading(false)
        }

    private fun setupRecyclerView() {
        binding.rvUsers.layoutManager = LinearLayoutManager(this)
        binding.rvUsers.adapter = listUserAdapter
        binding.rvUsers.setHasFixedSize(true)

        listUserAdapter.setOnItemClickCallback(object : ListUserAdapter.OnItemClickCallback {
            override fun onItemClicked(data: User) {
                val intent = Intent(this@MainActivity, DetailActivity::class.java)
                intent.putExtra(DetailActivity.EXTRA_USERNAME, data.username)
                startActivity(intent)
            }
        })
    }

    private fun showLoading(state: Boolean) {
        if (state) {
            binding.listUserShimmerContainer.visibility = View.VISIBLE
        } else {
            binding.listUserShimmerContainer.visibility = View.GONE
        }
    }
}

// Model User
@Entity
@Parcelize
data class User(
    @PrimaryKey(autoGenerate = false)
    @SerializedName("id")
    val id: Int,

    @SerializedName("login")
    val username: String,

    @SerializedName("name")
    val name: String?,

    @SerializedName("avatar_url")
    val avatarUrl: String?,

    @SerializedName("company")
    val company: String?,

    @SerializedName("location")
    val location: String?,

    @SerializedName("public_repos")
    val repositoryCount: Int?,

    @SerializedName("followers")
    val followers: Int?,

    @SerializedName("following")
    val following: Int?,

    @SerializedName("html_url")
    val profileUrl: String?,

    @SerializedName("followers_url")
    val followersUrl: String?,

    @SerializedName("following_url")
    val followingUrl: String?,

    @SerializedName("created_at")
    val createdDate: String?,
) : Parcelable