1

我目前正在将 Mike Penz Fastadapter 与 Android Room 结合使用。可扩展模型类需要这样实现:

public class MyClass<Parent extends IItem & IExpandable,
        SubItem extends IItem & ISubItem>
        extends AbstractExpandableItem<MyClass<Parent, SubItem>, MyClass.ViewHolder, SubItem> {

我想将该模型也用作房间实体。第一个问题很容易解决——我创建了一个自定义版本的 AbstractExpandableItem,其中的字段将使用@Ignore 标签进行注释,以免妨碍代码生成。Fastadapter 的一个更简单的实现以这种方式工作得很好。

但是,Room 似乎在实体的有界类型参数方面存在问题,因为它在 DAO 实现中引发了以下编译错误:

  • 错误:(40, 115) 错误: 找不到符号类 Parent
  • 错误:(40, 123) 错误:找不到符号类 SubItem

我的 DAO 是:

    @Dao
public interface MyDAO {

    @Query("Select * from Table")
    LiveData<List<MyClass>> getAllStuff();

这个人不同,我无法通过更新解决我的问题 - 我将 Room gradle 版本放在 1.1.1 上,但错误仍然发生。

4

1 回答 1

4

FastAdapter 还提供了定义一个普通Model类的可能性,它可以是一个超级简单的 POJO 和一个Item类。

这样,您可以在模型中拥有所有数据定义,这不需要任何父类或实现,并且Item将执行 UI 绑定。

可以在 的示例应用程序中找到一个简单的示例FastAdapter

ItemAdapter您将使用 a而不是a ModelAdapter,然后提供有关您的模型如何转换为 a 的逻辑Item

这可以很简单:

ModelAdapter<IconModel, ModelIconItem> itemAdapter = new ModelAdapter<>(new IInterceptor<IconModel, ModelIconItem>() {
        @Override
        public ModelIconItem intercept(IconModel iconModel) {
            return new ModelIconItem(iconModel);
        }
});

对于这个简单的示例,模型如下所示:

public class IconModel {
    public IIcon icon;

    public IconModel(IIcon icon) {
        this.icon = icon;
    }
}

该项目如下所示:

public class ModelIconItem extends ModelAbstractItem<com.mikepenz.fastadapter.app.model.IconModel, ModelIconItem, ModelIconItem.ViewHolder> {
    public ModelIconItem(com.mikepenz.fastadapter.app.model.IconModel icon) {
        super(icon);
    }
    @Override
    public int getType() {
        return R.id.fastadapter_model_icon_item_id;
    }
    @Override
    public int getLayoutRes() {
        return R.layout.icon_item;
    }
    @Override
    public void bindView(ViewHolder viewHolder, List<Object> payloads) {
        super.bindView(viewHolder, payloads);

        ... bind logic
    }
    @Override
    public ViewHolder getViewHolder(View v) {
        return new ViewHolder(v);
    }
    protected static class ViewHolder extends RecyclerView.ViewHolder {
        protected View view;
        @BindView(R.id.name)
        public TextView name;
        @BindView(R.id.icon)
        public IconicsImageView image;

        public ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
            this.view = view;
        }
    }
}

完整的示例代码可以在这里找到: https ://github.com/mikepenz/FastAdapter/blob/develop/app/src/main/java/com/mikepenz/fastadapter/app/ModelItemActivity.java#L51

于 2018-09-23T13:44:51.780 回答