Android Realm Recyclerview Example - 반응형 뷰 만들기
Realm + RecyclerView
모바일 개발을 하면서 데이터를 저정할 DB가 필요하다면 realm을 사용하는 것을 추천한다. 일단 빠름, 반응형을 모티브로 하는 다양한 기능 제공한다. 또한, DB를 조회하기 위한 쿼리를 작성하는 것이 아니라 객체의 클래스 get,set 활용, 객체 단위로 저장하기에 편리하다.
기존의 Adapter를 만들때 recyclerviewAdapter 대신 realmRecyclerViewAdapter를 상속받아서 어댑터를 구현하면 realm db의 모델과 뷰를 연결시킬 수 있다. 기존의 리사이클뷰에서는 데이터가 변할 떄 notifychanged()를 통해서 알려줘야 했다면 realmRecyclerViewAdapter를 상속받은 어댑터는 모델의 변화에 따라 알아서 뷰를 갱신한다.
gradle 세팅
//프로젝트 수준
maven { url "https://jitpack.io" }
//앱 수준
dependencies {
...
...
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'io.realm:android-adapters:2.0.0'
}
- androidx의 recyclerview + io.realm.android-adapter 사용하여 그리드 뷰 구현 준비
레이아웃 설정
- R.layout.main.xml 에서 recyclerView 만들기
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
- recyclerView에 담길 R.layout.list_item.xml 생성
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:descendantFocusability="blocksDescendants"
android:orientation="vertical">
<ImageView
android:id="@+id/imv"
android:layout_width="match_parent"
android:layout_height="120dp"/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="120dp"
android:text="test" />
</LinearLyaout>
Adapter 만들기
public class TestAdapter extends RealmRecyclerViewAdapter<Test, TestAdapter.MyViewholder> {
public TestAdapter(@Nullable OrderedRealmCollection<Video> data, boolean autoUpdate) {
super(data, autoUpdate);
}
@NonNull
@Override
public MyViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home, parent, false);
return new TestAdapter.MyViewholder(v);
}
@Override
public void onBindViewHolder(@NonNull MyViewholder holder, int position) {
final Test t = getItem(position);
if(t != null) {
tv.setText(t.getText());
imv.setImageResource(R.drawable.???);
}
}
public class MyViewholder extends RecyclerView.ViewHolder {
ImageView imv;
TextView tv;
public MyViewholder(@NonNull View itemView) {
super(itemView);
this.imv = itemView.findViewById(R.id.imv);
this.tv = itemView.findViewById(R.id.tv);
}
}
}
- co.moonmonkeylabs.realmsearchview.RealmSearchAdapter & RealmSearchViewHolder; 를 import
- RealmSearchAdapter를 상속받고 어댑터에 적용시킬 객체 클래스와 정보를 담을 뷰홀더 필요
- 처음에 TestAdpater()를 생성할 때 autoUpdater 값을 true로 설정해줘야 모델의 변화에 따라 뷰가 자동 갱신된다.
- 기존의 리사이클뷰의 어댑터와 달리 getPosition() getId 등의 거추장스러운 메소드는 필요가 없다. getItem() 은 부모의 메소드
public class Test extends RealmObject {
String text;
Test() { }
Test(String text) { this.text = text; }
public String getText() { return this.text; }
public setText(String text) { this.text = text; }
}
- Test.class 는 realm DB 에 사용되는 객체
recyclerview.setAdapter()
Realm realm = Realm.getDefaultInstance();
RealmResults<Video> model = realm.where(Test.class).findAll();
TestAdapter testAdapter = new TestAdapter(model);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setAdapter(homeAdapter);
- 액티비티나 프래그먼트에서 TestAdapter 와 RecyclerView 연결하기
결론
안드로이드 realm 을 사용하고 데이터를 그리드의 형태로 표현한다면 RealmRecyclerViewAdapter를 사용하는 것이 좋다.
- 모델의 변화에 따라 자동으로 뷰가 갱신
- 기존의 리사이클 어댑터에서 쓰이는 불필요한 코드 작성을 줄일 수 있다.
참고자료
결론
- 모바일 개발에서 DB가 필요하다면 realm db 강추 .. 가이드가 많아 활용하기 쉽고 빠르다