-
카테고리
-
세부 분야
모바일 앱 개발
-
해결 여부
해결됨
[Retrofit 간단한 예제 변경 + RecyclerView 추가] 에 databinding 추가해 보았습니다.
24.04.26 15:16 작성 조회수 47
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) } } }
답변을 작성해보세요.
0
개복치개발자
지식공유자2024.04.29
안녕하세요
잘 하신 것 같은데, 혹시 어떤 부분이 궁금하실까요? (조금 더 구체적으로 문의주시면 도움드릴 수 있을 것 같습니다!)
또한 two way binding도 한번 적용해보시면 좋을 것 같은데
https://www.inflearn.com/course/%EC%B9%9C%EC%A0%88%ED%95%9C-jetpack-2
위의 강의에 섹션1에 무료로 공개되어 있으니 한번 참고해보셔도 좋을 것 같습니다.
0
인프런 AI 인턴
2024.04.28
안녕하세요, 인프런 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을 다른 라이브러리와 함께 사용하면서 발생하는 혼란은 시간이 지나면서 더 익숙해지실 겁니다. 님의 노력으로 더 나은 앱 개발자가 되실 것이라 확신합니다. 질문이 있으시면 언제든지 추가로 문의해 주세요.
답변 2