2016-11-30 2 views
0

私はRealm findAll()に裏打ちされたRecyclerViewを持っています。私はRealmChangeListenerを使用して更新についてのリストを通知し、鈍器のnotifyDataSetChanged()を頻繁に使用するとすべてがうまく機能します。厳密なモデル/表示の分離を伴うAndroid-Realmリスト

private RealmResults<Sale> allSales; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    .... 

    // Update sales list whenever the AllSales result changes 
    allSales = getRealm().where(Sale.class).findAll(); 
    allSalesListener = new RealmChangeListener<RealmResults<Sale>>() { 
     @Override 
     public void onChange(RealmResults<Sale> results) { 
      saleAdapter.notifyDataSetChanged(); 
     }}; 
    allSales.addChangeListener(allSalesListener); 
    .... 

しかし、私は実際のViewModelに、私のフラグメントのうち、すべてのレルムコードを保ち、良いMVVC構造を持っているしたいと思います。レルムの例はこれをしません。そして、たぶん理由があります - RealmResultsの変更をアダプターに適切に通知するためのエレガントな方法はありません。データバインディングはまだありません。 ObservableCollectionを使用してRecyclerViewをサポートすることはサポートされていないように見えますが、RealmResultはObservableCollectionではありません。

この時点で、私は自分のFragmentに "ListChangedListener"インターフェースを作成し、ViewModelのすべてのListプロパティのリスナーのコレクションを手動で維持する必要があると考えています。しかし、それはView/Model分離を維持するために非常に多くの余分なコードのように思えます。

TLDR:のRealmでサポートされているListViewまたはRecyclerViewの例を探しています。表示コードにというレルムコードはありません。あるいは、私のカスタム "リスナー"インターフェースが良い道筋であることを確信さえするだけです。

更新:私は何とかRealmRecyclerViewAdapterを見落としました。下の私の答えを見てください。

答えて

0

RealmライブラリにはRealmRecyclerViewAdapter基本クラスが含まれていますが、これは何とか見落とされていました。 MVVCの意図がいかに優れていても、アダプターは実際にモデルの実装から離れることはできません。そのため、アダプターは意図されたものになることもあります。

とにかく、きれいでコンパクトです。自分自身に賛成し、review the exampleしてください。

ここでAndroidのデータバインディングは、アダプターとViewHolderもクリーンかつ簡単にするために行フィールドを使用して、ミニマリストの作業の実装です:

private void setUpRecyclerView() { 
    // Called from your onCreateView(...) 
    recyclerView.setLayoutManager(new LinearLayoutManager(mainActivity)); 
    recyclerView.setAdapter(new MyRecyclerViewAdapter(mainActivity, mainActivity.getDb().serialsRR)); 
    recyclerView.setHasFixedSize(true); 
} 



public class MyRecyclerViewAdapter extends RealmRecyclerViewAdapter<Serial, MyRecyclerViewAdapter.SerialViewHolder> { 

    private final ActivityMain activity; 

    public MyRecyclerViewAdapter(ActivityMain activity, OrderedRealmCollection<Serial> data) { 
     super(activity, data, true); 
     this.activity = activity; 
    } 

    @Override 
    public SerialViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.serial_row, parent, false); 
     return new SerialViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(SerialViewHolder holder, int position) { 
     SerialRowBinding rowBinding = holder.getBinding(); 
     rowBinding.setSerial(getData().get(position)); 
    } 

    class SerialViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener { 
     @Getter SerialRowBinding binding; 

     public SerialViewHolder(View view) { 
      super(view); 
      binding = DataBindingUtil.bind(view); 
     } 
    } 
} 
関連する問題