쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코테
  • DataBinding
  • Android
  • 코틀린코테
  • 변수
  • 상속
  • mvvm
  • compose
  • 코틀린
  • 자료구조
  • Room
  • 코드업100제
  • livedata
  • 객체지향
  • Kotlin
  • AAC
  • 프로젝트회고
  • 백준
  • Adapter
  • ViewModel
  • 메소드
  • 자바
  • 알고리즘
  • 배열
  • 기초100제
  • 코딩테스트
  • 리사이클러뷰
  • 컴포즈
  • Jetpack
  • workmanager

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[JETPACK개론] Retrofit 예제 + RecyclerView
Android/JETPACK

[JETPACK개론] Retrofit 예제 + RecyclerView

2022. 8. 27. 23:59

먼저 기존의 포스팅 했던 게시물에 이어서 Retrofit + ViewModel + ViewModelScope + RecyclerView 를 이용하여

여태까지 공부했던 내용을 합쳐 예제를 통해 연습해보자!

Retrofit 게시물 ->

 

[JETPACK개론] Retrofit

트러버 앱을 만들면서 Retrofit을 많이 이용하였는데 ViewModel 과 코루틴과 같이 사용해본 경험은 없어 아쉬움이 큰 프로젝트였다. 따라서 이번 젯팩 인프런 강의를 들으면서 다시 한번 복습하며 Vie

ssongcode.tistory.com

@GET("posts/1")
suspend fun getPost1() : Post

@GET("posts/{number}")
suspend fun getPostNumber(
    @Path("number") number : Int
) : Post

@GET("posts")
suspend fun getPostALl() : List<Post>
data class Post (
    val userId : Int,
    val id : Int,
    val title : String,
    val body : String
)

위와 같이 셋팅이 되어있고 다음과 같이 ViewModel을 구현해주었다.

먼저 리사이클러뷰를 적용하기 전에 단순히 ViewModel에서 서버와 통신하여 받아온 데이터를 통해 뷰에 접근해보자.

class MainViewModel : ViewModel() {

    private val retrofitInstance = RetrofitInstance.getInstance().create(MyApi::class.java)

    private var _mutableWord1 = MutableLiveData<String>()
    val liveWord1 : LiveData<String>
        get() = _mutableWord1

    private var _mutableWord2 = MutableLiveData<String>()
    val liveWord2 : LiveData<String>
        get() = _mutableWord2
fun getPost1() = viewModelScope.launch {

    val post = retrofitInstance.getPost1()
    Log.d("MainViewModel", post.toString())
    _mutableWord1.value = post.title

}

fun getPostNumber(number : Int) = viewModelScope.launch {

    val post = retrofitInstance.getPostNumber(number)
    Log.d("MainViewMoel", post.toString())
    _mutableWord2.value = post.title
}

retrofitInstance를 통해 api를 불러온 값을 post에 저장한 뒤, post에 있는 title의 값을 mutable값에 넣어

liveword의 값에 변화를 주었다. 

viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
viewModel.getPost1()
viewModel.getPostNumber(3)
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()
})

액티비티의 코드는 위와 같이 구현할 수 있었다.

getPost와 postNumber를 불러 liveWord의 값에 변화를 준다음, observe를 통해 뷰에 있는 text의 값을 서버에서 불러온 title데이터의 값으로 변경시켰다!!

결과화면

그 다음 리사이클러뷰 추가해서 구현해보자!!

class CustomAdapter(private val dataSet : ArrayList<Post>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {

    class ViewHolder(view : View) : RecyclerView.ViewHolder(view) {

        val textView : TextView

        init {
            textView = view.findViewById(R.id.textView)
        }

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomAdapter.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.text_row_item, parent, false)

        return ViewHolder(view)

    }

    override fun onBindViewHolder(holder: CustomAdapter.ViewHolder, position: Int) {

        holder.textView.text = dataSet[position].title

    }

    override fun getItemCount(): Int {
        return dataSet.size
    }
}

위와 같이 어댑터를 통해 서버에서 받은 리스트들의 title의 값을 텍스트로 변경한다!

private var _mutableWordList = MutableLiveData<List<Post>>()
val liveWordList : LiveData<List<Post>>
    get() = _mutableWordList
fun getPostAll() = viewModelScope.launch {
    val postAll = retrofitInstance.getPostALl()
    Log.d("MainViewModel", postAll.toString())
    _mutableWordList.value = postAll
}

리사이클러뷰에 적용하기 위해 데이터의 값을 List<Post> 형태로  받았고, 이를 역시 mutable에 넣어

liveWordList의 값을 변화시켰다.

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)
})

이제 액티비티에서 위와 같이 liveWordList의 변화에 따라 어댑터에 넣어주어 리사이클러뷰와 연결시켜주면 끝!!!

결과화면

 

 

GitHub - SsongSik/JetPack_Android_Practice: Android practice using the Jetpack library

Android practice using the Jetpack library. Contribute to SsongSik/JetPack_Android_Practice development by creating an account on GitHub.

github.com

 

저작자표시 (새창열림)

'Android > JETPACK' 카테고리의 다른 글

[JETPACK개론] SQLite(1)  (0) 2022.08.29
[JETPACK개론] Retrofit + ViewModelScope + RV + Glide  (0) 2022.08.28
[JETPACK개론] Coroutine / ViewModelScope  (0) 2022.08.26
[JETPACK개론] Retrofit의 CallBack Hell  (0) 2022.08.25
[JETPACK개론] Retrofit  (0) 2022.08.24
    'Android/JETPACK' 카테고리의 다른 글
    • [JETPACK개론] SQLite(1)
    • [JETPACK개론] Retrofit + ViewModelScope + RV + Glide
    • [JETPACK개론] Coroutine / ViewModelScope
    • [JETPACK개론] Retrofit의 CallBack Hell
    쏭식
    쏭식

    티스토리툴바