【问题标题】:Android Room: Is it possible to use bounded type parameters in an entity?Android Room:是否可以在实体中使用有界类型参数?
【发布时间】:2018-09-06 22:19:36
【问题描述】:

我目前正在将 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) 错误:找不到符号类子项

我的 DAO 是:

    @Dao
public interface MyDAO {

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

this guy 不同,我无法通过更新解决我的问题 - 我将 Room gradle 版本设置为 1.1.1,但错误仍然存​​在。

【问题讨论】:

    标签: android android-room type-parameter bounded-types fastadapter


    【解决方案1】:

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

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

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

    您将使用ModelAdapter 而不是ItemAdapter,然后提供有关您的模型如何转换为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

    【讨论】:

    • 非常感谢您亲自回答,这正是我需要的建议 :) 拆分项目和模型是 Room 的方式。你的图书馆摇滚!
    猜你喜欢
    • 1970-01-01
    • 2018-05-18
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多