Adatper

class CustomDataAdapter (private val dataSet : ArrayList<String>) : RecyclerView.Adapter<CustomDataAdapter.ViewHolder>(){

    class ViewHolder(binding : TextRowItemBinding) : RecyclerView.ViewHolder(binding.root){

        val myText : TextView = binding.myText



    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):ViewHolder {


        val view = DataBindingUtil.inflate<TextRowItemBinding>(LayoutInflater.from(parent.context),
            R.layout.text_row_item,parent,false)

        return ViewHolder(view)

    }

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

        holder.myText.text = dataSet[position]
    }

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

Activity

 

class DataBindingActivity : AppCompatActivity() {

    private lateinit var binding : ActivityDataBindingBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.setContentView(this,R.layout.activity_data_binding)

        val array = ArrayList<String>()

        array.add("a")
        array.add("b")
        array.add("c")
        array.add("d")
        array.add("e")
        array.add("f")
        array.add("g")
        array.add("h")
        array.add("j")
        array.add("k")

        val customViewAdapter = CustomDataAdapter(array)

        val rv = binding.rv
        rv.adapter = customViewAdapter
        rv.layoutManager = LinearLayoutManager(this)

        return


    }
}
 

 

text_row_item.xml (item의 res파일에도 가장 밖에 layout을 둘러줘야함.)

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp">


        <TextView
            android:id="@+id/myText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="HELLO"
            android:textSize="40sp" />

    </LinearLayout>
</layout>
 

 

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

DataBinding과 data class  (0) 2022.11.21
DataBinding 사용하기  (0) 2022.11.21

 

data class를 생성.

package com.example.bindingtest

data class Person(

    val name: String,
    val age: Int


)
 

 

 

 

res 파일에 data 형식 지정. type 은 dataclass 경로.

<?xml version="1.0" encoding="utf-8"?>
<layout 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">

    //data 형식 지정.
    <data>

        <variable
            name="user"
            type="com.example.bindingtest.Person" />

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
 

 

 

data class 형식에 맞춰 집어넣고

res파일 user와 결합.

res파일에서도 logic을 구현하여 실행 가능.(비추)

class MainActivity : AppCompatActivity() {

    private lateinit var binding : ActivityMainBinding

    var testCount = 20

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)

        val person = Person("강병진",20)
        binding.user = person

    }

    fun myClick(view : View){ //버튼 누를 때마다 testCount++
        Log.d("MainActivity","onClick")
        testCount++

        val person = Person("강병진",testCount)
        binding.user = person

    }
}
 
<TextView
            android:id="@+id/dataBindingEx"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.name}"
            android:textSize="50sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />


        <!--  xml에서 logic을 넣는 것은 선호하지 않는 방식.          -->
        <TextView
            android:id="@+id/dataBindingEx2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:text="@{user.age > 30 ? `나이 많음` : `나이 적음`}"
            android:textSize="50sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.501"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/dataBindingEx"
            app:layout_constraintVertical_bias="0.174" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{Integer.toString(user.age)}"
            android:textSize="50sp"
            app:layout_constraintBottom_toTopOf="@+id/dataBindingEx"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="myClick"
            android:text="btn"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/dataBindingEx2" />
 

 

 

 

 

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

DataBinding + Adapter  (0) 2022.11.21
DataBinding 사용하기  (0) 2022.11.21

 

ViewBinding이란 findViewById를 개발자 대신 자동화 해 주는 기능이라고 보면 되고, DataBinding이란 ViewBinding 기능에 더해 imagePage.setText()와 같이 실제 데이터를 세팅해 주는 부분을 살짝 wrapping 시켜준다고 보면 된다.

 

build.gradle에 추가하기.

    kotlinOptions {
        jvmTarget = '1.8'
    }

   //dataBinding 추가.
    buildFeatures{
        dataBinding = true
    }
}

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.5.1'
 

 

 

 

res파일에서 가장 바깥 부분에 layout으로 감싸주기.(Fragment랑 연결된 res파일도 동일.)

<?xml version="1.0" encoding="utf-8"?>
<layout //이부분
    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">


    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/dataBindingEx"
            android:textSize="50sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout> //이부분
 

 

 

Activity Ex.

class MainActivity : AppCompatActivity() {

    private lateinit var binding : ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main)


        binding.dataBindingEx.text = "바뀐 텍스트"
        binding.dataBindingEx.setOnClickListener{
            val intent = Intent(this,SecondActivity::class.java)
            startActivity(intent)
        }
    }
}
 

 

 

Fragment Ex.

package com.example.bindingtest

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import com.example.bindingtest.databinding.FragmentTestBinding

class TestFragment : Fragment() {

    lateinit var binding: FragmentTestBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container,false)

        binding.testText.text = "변경된 텍스트"



        return binding.root
    }


}
 

 

 

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

DataBinding + Adapter  (0) 2022.11.21
DataBinding과 data class  (0) 2022.11.21

+ Recent posts