具有严格模型/视图分离的Android-Realm列表

时间:2016-11-30 21:48:54

标签: android realm

我有一个由Realm findAll()支持的RecyclerView。我使用RealmChangeListener来通知列表有关更新的信息,并且由于使用了大量的工具notifyDataSetChanged()而一切正常。

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代码保存在ViewModel中并保留在Fragment中。 Realm示例不会这样做。并且可能有充分的理由 - 我没有看到一种优雅的方式来适当地通知适配器RealmResults中的更改。还没有数据绑定;它似乎不支持使用ObservableCollection支持RecyclerView ......即使它支持,RealmResult也不是ObservableCollection。

此时,我认为我需要在Fragment中创建一个“ListChangedListener”接口,并为我的ViewModel中的每个List属性手动维护一个监听器集合。但这似乎是为了维持视图/模型分离而增加的大量代码。

TLDR:我正在寻找一个Realm支持的ListView或RecyclerView的示例,在View代码中使用 no Realm code 。或者甚至只是保证我的自定义“监听器”界面是一条很好的前进道路。

更新:我不知何故忽略了RealmRecyclerViewAdapter。请参阅下面的答案。

1 个答案:

答案 0 :(得分:0)

Realm库包含一个RealmRecyclerViewAdapter基类,我忽略了它。无论你的MVVC意图有多好,适配器都不能真正脱离模型实现,所以它也可能是它的目的。

无论如何,它非常干净和紧凑。帮自己一个忙,review the example

这是一个极简主义的工作实现,Android Databinding用于行字段,使Adapter和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);
        }
    }
}