본문 바로가기

ANDROID

ViewModel + LiveData + DataBinding 을 적용 해보자

일반적으로 같은 화면 에서 데이터 및 UI를 변경하고 사진과 같이 효과를 주면 UI 값의 초기화가 되어 있는것을 확인 할수 있다.

해당 내용의 UI를 지속적으로 반영할수 있게 진행 할려 한다.

먼저 DataBinding 으로 코드를 간략하게 하고 LiveData 와 ViewModel를 이용해 데이터를 유지 할려한다.

회전이 느리다...

 

1. Gradle 셋팅 (DataBinding)

android {

    dataBinding {
        enabled = true
    }
}

 

2. layout 셋팅 (DataBinding)

    일반 레이아웃과 다르게 DataBinding 을 사용하기 위해 layout 태그를 을 취상위로 감싸고  그 밑에 data 태그를 추가한다.

<?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>
        <variable
            name="main"
            type="com.example.livedataproject.MainActivity"/>
    </data>


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/countTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"
            android:textSize="200dp"
            android:layout_centerVertical="true"
            android:layout_centerHorizontal="true"/>

        <Button
            android:id="@+id/textAddData"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="숫자 카운트"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"/>

    </RelativeLayout>

</layout>

3. java 셋팅 (DataBinding)

  - 적용전

public class MainActivity extends AppCompatActivity {

    Button textAddData;
    TextView countTextView;
    private int count = 0;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
            
        textAddData = findViewById(R.id.textAddData);
        countTextView = findViewById(R.id.countTextView);

        textAddData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                count++;
                countTextView.setText(count+"");
            }
        });
    }
}

  - 적용후

public class MainActivity extends AppCompatActivity {

    private int count = 0;
    ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        binding.textAddData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                count++;
                binding.countTextView.setText(count+"");
            }
        });
    }
}

findviewById 자체를 사용하지 않아 코드 자체가 줄어든것을 확인 할수 있다.


1. Gradle 설정 

dependencies {
 
    def lifecycle_version = "2.2.0"

    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
}

2. ViewModel 클래스 생성

public class CounterVM extends ViewModel
{
    public int count = 0;
}

 

3. java 셋팅 (ViewModel)

   - ViewModelProvides.of 문법은 삭제되어 더이상 사용하지 않는다.

   - https://developer.android.com/jetpack/androidx/releases/lifecycle?hl=ko

 ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        final CounterVM counterVM = new ViewModelProvider(this).get(CounterVM.class);

        binding.countTextView.setText(counterVM.count+"");

        binding.textAddData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                counterVM.count++;
                binding.countTextView.setText(counterVM.count+"");
            }
        });
    }

정상 작동 완료!

 이제 LiveData를 이용해 만들어보자.

 LiveData에는 값이 변경될때마다 값을 변경할수 있는 (관찰?) 옵져버블이 지원 되므로 사용이 가능하다.


1. ViewModel 클래스 수정

public class CounterVM extends ViewModel
{
    public MutableLiveData<Integer> count = new MutableLiveData<>();

    public CounterVM() {
        count.setValue(0);
    }

    public void setPlusCount()
    {
        count.setValue(count.getValue() +1);
    }
}

 

2. java 셋팅 (LiveData)

ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

        final CounterVM counterVM = new ViewModelProvider(this).get(CounterVM.class);

        binding.countTextView.setText(counterVM.count+"");

        binding.textAddData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                counterVM.setPlusCount();
            }
        });

        counterVM.count.observe(this, new Observer<Integer>() {
            @Override
            public void onChanged(Integer integer) {
                binding.countTextView.setText(integer+"");
            }
        });
    }

 

※ 더 좋은 내용있으면 댓글 주세요!