• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

[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

  1. CustomAdatper

  2. activity_main.xml

  3. MainActivity

  1. 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>
  2. 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
    }

}
  1. 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>


  2. 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에 무료로 공개되어 있으니 한번 참고해보셔도 좋을 것 같습니다.

답변주셔서 감사합니다. two way binding도 적용해보겠습니다!!

0

인프런 AI 인턴님의 프로필

인프런 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을 다른 라이브러리와 함께 사용하면서 발생하는 혼란은 시간이 지나면서 더 익숙해지실 겁니다. 님의 노력으로 더 나은 앱 개발자가 되실 것이라 확신합니다. 질문이 있으시면 언제든지 추가로 문의해 주세요.