2017-05-31 78 views
0

我正在使用FastAdapter因为它很有趣并且使我无法编写适配器类。这里是一个类:在扩展AbstractItem的同时实现RealmModel

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 

请告诉我如何使用领域与FastAdapter。

+0

我仍然使用领域和FastAdapter,但你'ProductsModel'上方的代码不是Realm中的模型,它是代表适配器中项目的**项目**。所以它不能'实现RealmModel'。这只是项目,你需要遵循fastadapter的例子来做到这一点。 –

+0

谢谢,你能分享任何示例/教程吗?我没有[this](https://github.com/mikepenz/FastAdapter/tree/develop/library-extensions-realm) –

+0

你可以从https://github.com/mikepenz/FastAdapter/tree/得到它开发/应用程序。只需全部并建立它。 –

回答

2

如果您无法扩展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); 
     } 
    } 
} 

为了简化它,我已删除的意见,和不必要的制定者。 https://github.com/mikepenz/FastAdapter/blob/develop/app/src/main/java/com/mikepenz/fastadapter/app/items/RealmSampleUserItem.java

如果你有兴趣,在这里你可以找到默认AbstractItem实现:一个完整​​的样品可以在FastAdapter s的采样源在这里找到 https://github.com/mikepenz/FastAdapter/blob/develop/library-core/src/main/java/com/mikepenz/fastadapter/items/AbstractItem.java

+0

无法实现'OnClick'。你可以看看[这里](https://gist.github.com/tariqul-islam1/afbea341923d2c550f922194607513e3)并告诉我我错过了什么? –

+0

我真的不明白你在做什么。该模型没有收听者。你可以附加一个FastAdapter – mikepenz

+0

你可以请看看[这个SO问题](https://stackoverflow.com/questions/44364540/implement-onclicklistener-on-fastadapter-implementing-iitem)? –