2017-05-31 79 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)? –