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.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp" />
<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);
        }
    }
}
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; }
}

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);

결론

안드로이드 realm 을 사용하고 데이터를 그리드의 형태로 표현한다면 RealmRecyclerViewAdapter를 사용하는 것이 좋다.

참고자료

결론



Related Posts