我有一个由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。请参阅下面的答案。
答案 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);
}
}
}