【问题标题】:Android-Realm list with strict Model/View separation具有严格模型/视图分离的 Android-Realm 列表
【发布时间】:2016-11-30 21:48:54
【问题描述】:

我有一个由 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 属性手动维护一组侦听器。但这似乎是为了维护 View/Model 分离而编写的大量额外代码。

TLDR:我正在寻找一个 Realm 支持的 ListView 或 RecyclerView 示例,在 View 代码中 没有任何 Realm 代码。甚至只是让我确信我的自定义“监听器”界面是一条不错的前进道路。

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

【问题讨论】:

    标签: android realm


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多