【问题标题】:Implement RealmModel while extending AbstractItem在扩展 AbstractItem 的同时实现 RealmModel
【发布时间】:2017-05-31 04:07:15
【问题描述】:

我使用的是FastAdapter,因为它很有趣,让我不必编写适配器类。这是一个类:

public class ProductsModel extends AbstractItem<ProductsModel, ProductsModel.ViewHolder> {

但最近我想使用Realm 而不是SQLite。所以我想这样做:

public class ProductsModel extends AbstractItem<ProductsModel, ProductsModel.ViewHolder> implements RealmModel {

在任何交易之前,我都是这样做的:

RealmResults<ProductsModel> productsModels = realm.where(ProductsModel.class).findAll(); // <- this line is generating the exception
if(productsModels.size() == 0){ //no product is saved, download now

}

但是得到这个异常:

java.lang.IllegalArgumentException: AbstractItem is not part of the schema for this Realm

请告诉我如何将 Realm 与 FastAdapter 一起使用。

【问题讨论】:

  • 我仍然使用 Realm 和 FastAdapter,但是由于您上面的代码 ProductsModel 不是 Realm 中的模型,它是一个 Item 代表适配器中的项目。所以它不能implements RealmModel。只是Item,你需要按照fastadapter的例子来做。
  • 谢谢,您能分享任何示例/教程吗?我没有收到this
  • 你可以从github.com/mikepenz/FastAdapter/tree/develop/app得到它。获取所有并构建它。
  • 好的,看到RealmSampleUserItem。我认为这会奏效

标签: android realm realm-mobile-platform fastadapter


【解决方案1】:

如果您不能扩展AbstractItemFastAdapter 允许您简单地实现IItem 接口。您将必须实现您已经知道的功能 + 通常由 AbstractItem 实现的功能

这是一个示例项目:

public class SampleRealmItem extends RealmObject implements IItem<SampleRealmItem, SampleRealmItem.ViewHolder> {
    // the identifier for this item
    @PrimaryKey
    protected long mIdentifier = -1;

    @Override
    public long getIdentifier() {
        return mIdentifier;
    }

    // the tag for this item
    @Ignore
    protected Object mTag;

    @Override
    public Object getTag() {
        return mTag;
    }

    // defines if this item is enabled
    @Ignore
    protected boolean mEnabled = true;

    @Override
    public boolean isEnabled() {
        return mEnabled;
    }

    // defines if the item is selected
    @Ignore
    protected boolean mSelected = false;

    @Override
    public SampleRealmItem withSetSelected(boolean selected) {
        this.mSelected = selected;
        return this;
    }

    @Override
    public boolean isSelected() {
        return mSelected;
    }

    // defines if this item is selectable
    @Ignore
    protected boolean mSelectable = true;

    @Override
    public SampleRealmItem withSelectable(boolean selectable) {
        this.mSelectable = selectable;
        return this;
    }

    @Override
    public boolean isSelectable() {
        return mSelectable;
    }

    @Override
    public int getType() {
        return R.id.some_id;
    }

    @Override
    public int getLayoutRes() {
        return R.layout.some_layout;
    }

    @Override
    public View generateView(Context ctx) {
        ViewHolder viewHolder = getViewHolder(LayoutInflater.from(ctx).inflate(getLayoutRes(), null, false));
        //as we already know the type of our ViewHolder cast it to our type
        bindView(viewHolder, Collections.EMPTY_LIST);
        //return the bound view
        return viewHolder.itemView;
    }

    @Override
    public View generateView(Context ctx, ViewGroup parent) {
        ViewHolder viewHolder = getViewHolder(LayoutInflater.from(ctx).inflate(getLayoutRes(), parent, false));
        //as we already know the type of our ViewHolder cast it to our type
        bindView(viewHolder, Collections.EMPTY_LIST);
        //return the bound and generatedView
        return viewHolder.itemView;
    }

    @Override
    public ViewHolder getViewHolder(ViewGroup parent) {
        return getViewHolder(LayoutInflater.from(parent.getContext()).inflate(getLayoutRes(), parent, false));
    }

    private ViewHolder getViewHolder(View v) {
        return new ViewHolder(v);
    }

    @Override
    public void bindView(ViewHolder holder, List<Object> payloads) {
        //set the selected state of this item. force this otherwise it may is missed when implementing an item
        holder.itemView.setSelected(isSelected());
        //set the tag of this item to this object (can be used when retrieving the view)
        holder.itemView.setTag(this);

        //handle your binding
    }

    @Override
    public void unbindView(ViewHolder holder) {
        holder.name.setText(null);
    }

    @Override
    public void attachToWindow(ViewHolder holder) {}

    @Override
    public void detachFromWindow(ViewHolder holder) {}

    @Override
    public boolean failedToRecycle(ViewHolder holder) {
        return false;
    }

    @Override
    public boolean equals(int id) {
        return id == mIdentifier;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        AbstractItem<?, ?> that = (AbstractItem<?, ?>) o;
        return mIdentifier == that.getIdentifier();
    }

    @Override
    public int hashCode() {
        return Long.valueOf(mIdentifier).hashCode();
    }

    protected static class ViewHolder extends RecyclerView.ViewHolder {
        public ViewHolder(View view) {
            super(view);
        }
    }
}

为了简化它,我删除了 cmets 和不必要的 setter。完整示例可在此处的 FastAdapters 示例源中找到: https://github.com/mikepenz/FastAdapter/blob/develop/app/src/main/java/com/mikepenz/fastadapter/app/items/RealmSampleUserItem.java

如果您有兴趣,可以在这里找到默认的AbstractItem 实现: https://github.com/mikepenz/FastAdapter/blob/develop/library-core/src/main/java/com/mikepenz/fastadapter/items/AbstractItem.java

【讨论】:

  • 无法实现OnClick。你能看看here,告诉我我错过了什么吗?
  • 我不太明白你想做什么。该模型没有侦听器。您可以将一个附加到 FastAdapter
  • 你能看看this SO question吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 2012-06-06
相关资源
最近更新 更多