class MainActivity : AppCompatActivity() {
lateinit var viewModel : MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
viewModel.getPost1()
viewModel.getPostNumber(2)
viewModel.getPostAll()
val area1 = findViewById<TextView>(R.id.area1)
val area2 = findViewById<TextView>(R.id.area2)
viewModel.liveWord1.observe(this, Observer {
area1.text = it.toString()
})
viewModel.liveWord2.observe(this, Observer {
area2.text = it.toString()
})
val rv = findViewById<RecyclerView>(R.id.rv)
viewModel.liveWordList.observe(this, Observer {
val customAdapter = CustomAdapter(it as ArrayList<Post>)
rv.adapter = customAdapter
rv.layoutManager = LinearLayoutManager(this)
})
}
}
class MainViewModel : ViewModel() {
private val retrofitInstance = RetrofitInstance.getInstance().create(MyApi::class.java)
private var _mutableWordList = MutableLiveData<List<Post>>()
val liveWordList : LiveData<List<Post>>
get() = _mutableWordList
private var _mutableWord1 = MutableLiveData<String>()
val liveWord1 : LiveData<String>
get() = _mutableWord1
private var _mutableWord2 = MutableLiveData<String>()
val liveWord2 : LiveData<String>
get() = _mutableWord2
fun getPostAll() = viewModelScope.launch {
val postList = retrofitInstance.getPostAll()
_mutableWordList.value = postList
}
fun getPost1() = viewModelScope.launch {
val post = retrofitInstance.getPost1()
_mutableWord1.value = post.title
}
fun getPostNumber(number : Int) = viewModelScope.launch {
val post = retrofitInstance.getPostNumber(number)
_mutableWord2.value = post.title
}
}
data class Post (
val userId : Int,
val id : Int,
val title : String,
val body : String
)
object RetrofitInstance {
val BASE_URL = "https://jsonplaceholder.typicode.com/"
val client = Retrofit
.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
fun getInstance() : Retrofit {
return client
}
}
interface MyApi {
@GET("posts")
suspend fun getPostAll() : List<Post>
@GET("posts/1")
suspend fun getPost1() : Post
@GET("posts/{number}")
suspend fun getPostNumber(
@Path("number") number : Int
) : Post
}
class CustomAdapter(private val dataSet: ArrayList<Post>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView
init {
// Define click listener for the ViewHolder's View.
textView = view.findViewById(R.id.textView)
}
}
// Create new views (invoked by the layout manager)
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
// Create a new view, which defines the UI of the list item
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.text_row_item, viewGroup, false)
return ViewHolder(view)
}
// Replace the contents of a view (invoked by the layout manager)
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
// Get element from your dataset at this position and replace the
// contents of the view with that element
viewHolder.textView.text = dataSet[position].title
}
// Return the size of your dataset (invoked by the layout manager)
override fun getItemCount() = dataSet.size
}
'Android Jetpack' 카테고리의 다른 글
WorkManager 주기적 실행 (0) | 2022.05.02 |
---|---|
Retrofit + ViewModelScope + RecyclerView + Glide Example (0) | 2022.04.20 |
기존 예제 변경 (0) | 2022.04.17 |
Simple Coroutine / ViewModelScope (0) | 2022.04.16 |
ViewModelScope (0) | 2022.04.13 |