2016-11-30 58 views
0

我有一個RecyclerView支持的領域findAll()。我使用RealmChangeListener來通知列表有關更新,並且由於大量使用鈍器樂器notifyDataSetChanged(),所有工作都非常有效。與嚴格模型/視圖分離的Android領域列表

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

但是,我真的很想有好的MVVC結構,保持所有領域代碼視圖模型和我的片段。 Realm的例子不這樣做。可能出於很好的理由 - 我沒有看到一種適當的方式來通知適配器RealmResults中的更改。數據綁定尚未完成;它似乎並不支持使用ObservableCollection支持RecyclerView ......即使這樣做,RealmResult也不是ObservableCollection。

在這一點上,我想我需要在我的Fragment中創建一個「ListChangedListener」接口,併爲ViewModel中的每個List屬性手動維護一組偵聽器。但是,這看起來像是一個額外的代碼,只是爲了維護視圖/模型分離。

TLDR:我正在尋找Realm支持的ListView或RecyclerView的例子,沒有Realtime代碼在View代碼中。或者甚至只是保證我的定製「聽衆」界面是一個很好的發展方向。

更新:我不知何故忽略了RealmRecyclerViewAdapter。請參閱下面的答案。

回答

0

Realm庫包含一個RealmRecyclerViewAdapter基類,我不知何故忽略了它。無論你的MVVC意圖多麼出色,Adapter都不能脫離模型實現,所以它也可能是它的目的之一。

無論如何,它非常乾淨和緊湊。幫你一個忙,review the example

下面是用於行領域,使適配器和ViewHolder更清潔和更簡單的簡約的工作實施,與Android的數據綁定:

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