2021.05.17 - [안드로이드/AAC, MVVM] - [Android] Retrofit 사용하여 서버와 http 통신하기 - (2) 동적주소, 쿼리 사용하기
에서 이어지는 글입니다.
이번에는 통신한 값들을 리싸이클러뷰에 표현하려고 한다.
메인레이아웃 변경
userId를 입력받아 그 결과값들을 출력하기 위해 레이아웃을 만들어준다.
리싸이클러뷰 아이템 생성
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="30dp"
android:layout_margin="10dp"
android:background="#DFD0D0">
<TextView
android:id="@+id/userIdText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:layout_margin="5dp"/>
<TextView
android:id="@+id/idText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:layout_margin="5dp"/>
<TextView
android:id="@+id/titleText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:layout_margin="5dp"/>
<TextView
android:id="@+id/bodyText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:layout_margin="5dp"/>
</LinearLayout>
리싸이클러뷰에서 아이템으로 사용해줄 레이아웃을 만들어준다.
리싸이클러뷰 어댑터 생성
class MyAdapter
: RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
private var myList = emptyList<Post>()
class MyViewHolder(val binding: ItemLayoutBinding) : RecyclerView.ViewHolder(binding.root)
// 어떤 xml 으로 뷰 홀더를 생성할지 지정
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val binding = ItemLayoutBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return MyViewHolder(binding)
}
// 뷰 홀더에 데이터 바인딩
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.binding.userIdText.text = myList[position].myUserId.toString()
holder.binding.idText.text = myList[position].id.toString()
holder.binding.titleText.text = myList[position].title
holder.binding.bodyText.text = myList[position].body
}
// 뷰 홀더의 개수 리턴
override fun getItemCount(): Int {
return myList.size
}
// 데이터 변경시 리스트 다시 할당
fun setData(newList : List<Post>){
myList = newList
// 새로고침
notifyDataSetChanged()
}
}
리싸이클러뷰에서 사용할 어댑터를 생성해준다.
setData를 메인에서 옵저버패턴으로 호출하여 리스트를 갱신할 것이다.
2021.05.17 - [안드로이드/기본] - [Android] 자주쓰는 RecyclerView 사용하기 (+ ViewBinding)
리싸이클러뷰에 대한 자세한 설명은 여기서 확인할 수 있다.
메인액티비티
class MainActivity : AppCompatActivity() {
private lateinit var viewModel : MainViewModel
private lateinit var binding : ActivityMainBinding
private val myAdapter by lazy { MyAdapter() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 뷰바인딩
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 어댑터 연결
binding.recyclerView.adapter = myAdapter
binding.recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false)
val repository = Repository()
val viewModelFactory = MainViewModelFactory(repository)
viewModel = ViewModelProvider(this,viewModelFactory).get(MainViewModel::class.java)
viewModel.myCustomPosts2.observe(this, Observer {
if(it.isSuccessful){
myAdapter.setData(it.body()!!)
}
else{
Toast.makeText(this,it.code(), Toast.LENGTH_SHORT).show()
}
})
// 받아온 값을 리싸이클러뷰에 보여줌
binding.button.setOnClickListener {
viewModel.getCustomPosts2(Integer.parseInt(binding.editTextView.text.toString()),"id","asc")
}
}
}
버튼클릭시 getCustomPosts2 메소드를 호출하여 myCustomPosts2 값이 바뀌기 때문에
옵저버패턴에 의해 호출되고, 통신이 잘 되었으면 어댑터의 setData에 리스트를 넘겨준다.
결과값이 잘 출력되는 것을 확인할 수 있다.
https://github.com/HanYeop/AndroidStudio-Practice/tree/master/Retrofit_Test