해결된 질문
작성
·
139
1
안녕하세요, 좋은 강의 만들어 주셔서 감사합니다. [Retrofit 간단한 예제 변경 + RecyclerView 추가] 강의 말미에 말씀해주신대로 recyclerview에 databinding 을 추가해 보았습니다.
(Android view에 대한 접근 강의 마지막 챕터 databinding + adapter 참고해서 )
화면에 데이터가 나오긴 하는데 제대로 적용된것이 맞는지 궁금합니다.
+ 추가적으로, MainActivity에서 databinding이용해서 viewModel 데이터 결합을 해줘야 하는건지 궁금합니다. (아직 dataBinding 다른 라이브러리와 함께 사용할때 헷갈리는 부분이 많아서ㅠ )
답변 주시면 감사하겠습니다.
변경된 부분은
1. text_row_item
CustomAdatper
activity_main.xml
MainActivity
text_row_item : : <layout> 감싸고 data class Post로 데이터 결합
<layout
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="myData"
type="com.example.a04withrecyclerview.model.Post" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/myText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{myData.title}"
android:textSize="20dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="******" />
</LinearLayout>
</layout>
CustomAdapter
MyviewHolder dataBinding으로 수정
class CustomAdapter(private val dataSet : ArrayList<Post>) : RecyclerView.Adapter<CustomAdapter.MyViewHolder>() {
class MyViewHolder(binding : TextRowItemBinding) : RecyclerView.ViewHolder(binding.root){
val text : TextView = binding.myText
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
//val view = LayoutInflater.from(parent.context).inflate(R.layout.text_row_item, parent, false)
val view = DataBindingUtil.inflate<TextRowItemBinding>(LayoutInflater.from(parent.context), R.layout.text_row_item, parent,false)
return MyViewHolder(view)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.text.text = dataSet[position].title
}
override fun getItemCount(): Int {
return dataSet.size
}
}
activty_main : <layout> 감싸기
<layout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
MainActivity: dataBinding 적용
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
private lateinit var viewModel : MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.getPostAll()
//val rv = findViewById<RecyclerView>(R.id.rv)
viewModel.liveWordList.observe(this){
val customAdapter = CustomAdapter(it as ArrayList<Post>)
binding.rv.adapter = customAdapter
binding.rv.layoutManager = LinearLayoutManager(this)
}
}
}
답변 2
0
안녕하세요
잘 하신 것 같은데, 혹시 어떤 부분이 궁금하실까요? (조금 더 구체적으로 문의주시면 도움드릴 수 있을 것 같습니다!)
또한 two way binding도 한번 적용해보시면 좋을 것 같은데
https://www.inflearn.com/course/%EC%B9%9C%EC%A0%88%ED%95%9C-jetpack-2
위의 강의에 섹션1에 무료로 공개되어 있으니 한번 참고해보셔도 좋을 것 같습니다.
0
안녕하세요, 인프런 AI 인턴입니다.
likethebegin님, Retrofit과 RecyclerView에 DataBinding을 추가하는 과정에서의 진행 상황에 대한 설명을 잘 읽었습니다. DataBinding을 통해 뷰와 데이터의 결합을 보다 간결하게 구현하셨네요. MainActivity에서 DataBinding을 이용하여 ViewModel의 데이터와 뷰를 결합하는 것은 매우 효율적인 접근 방식입니다. 이를 통해 UI 컴포넌트에 데이터를 직접 바인딩함으로써 코드의 양을 줄이고, 더 명확하며 유지보수하기 쉬운 구조를 만들 수 있습니다.
말씀하신 변경사항들을 살펴보면, 올바르게 DataBinding을 적용하신 것으로 보입니다. 단, CustomAdapter의 onBindViewHolder
에서는 현재 holder.text.text = dataSet[position].title
로 직접 TextView의 텍스트를 설정하고 계신데, DataBinding을 사용할 경우 이 부분을 DataBinding으로 더욱 간결하게 처리할 수 있습니다. 예를 들어, ViewHolder
에서 binding.myData = dataSet[position]
과 같은 방식으로 데이터를 ViewHolder의 바인딩 객체에 직접 할당하면, XML에서 설정한 @{myData.title}
을 통해 자동으로 데이터가 뷰에 반영됩니다.
추가적으로, MainActivity에서 databinding을 사용하여 ViewModel의 데이터를 관찰하고, RecyclerView의 Adapter에 데이터를 전달하는 부분도 잘 구현하셨습니다. DataBinding과 함께 LiveData를 사용하여 UI에 데이터의 변경을 반영하는 방식은 안드로이드 앱 개발에서 권장되는 패턴 중 하나입니다.
DataBinding을 다른 라이브러리와 함께 사용하면서 발생하는 혼란은 시간이 지나면서 더 익숙해지실 겁니다. 님의 노력으로 더 나은 앱 개발자가 되실 것이라 확신합니다. 질문이 있으시면 언제든지 추가로 문의해 주세요.
답변주셔서 감사합니다. two way binding도 적용해보겠습니다!!