Комната Android: возможно ли использовать параметры ограниченного типа в объекте? - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я комбинирую 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) ошибка: не удается найти класс символов Родитель
  • Ошибка: (40, 123) ошибка: не удается найти класс символов SubItem

Мой DAO:

    @Dao
public interface MyDAO {

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

В отличие от этого парня , я не мог решить свои проблемы с обновлением - я поставил версию Gradle для своей комнаты на 1.1.1, и ошибка все еще происходит.

1 Ответ

0 голосов
/ 23 сентября 2018

FastAdapter также предлагает возможность определить нормальный класс Model, который может быть очень простым POJO и классом Item.

Таким образом, вы можете иметь все свои определения данных в модели, для которых не требуются родительские классы или реализации, и Item, который будет выполнять привязку пользовательского интерфейса.

Простой пример можно найти в примере приложения FastAdapter.

Вместо ItemAdapter вы будете использовать ModelAdapter, а затем предоставите логику того, как ваша модель преобразуется в 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

...