簡體   English   中英

如何轉換Android SqlBrite模型類以實現Parcelable

[英]How to convert a Android SqlBrite model class to implement Parcelable

我正在構建一個應用程序,其中我使用SQLBrite sql包裝器執行所有數據庫操作。 另外,我正在使用“自動值”通過Google AutoValue庫自動處理我的所有getter和setter。

現在,我的問題是處理設備旋轉並處理我的putParcelable()方法需要兩個參數,其中第一個是KEY,第二個是Parcelable類型的值。 如前所述,我的Recipe類(下面的代碼)是SQLBrite實現的類,並且未實現Parcelable。 我想要一些幫助將其轉換為實現Parcelable接口。

@AutoValue
public abstract class Recipe {
    public abstract int id();
    public abstract String name();
    public abstract List<Ingredients> ingredients();
    public abstract List<Step> steps();
    public abstract int servings();
    public abstract String image();

    public static Builder builder() {
        return new AutoValue_Recipe.Builder();
    }

    public static TypeAdapter<Recipe> typeAdapter(Gson gson) {
        return new AutoValue_Recipe.GsonTypeAdapter(gson);
    }

    @AutoValue.Builder
    public abstract static class Builder {
        public abstract Builder id(int id);
        public abstract Builder name(String name);
        public abstract Builder ingredients(List<Ingredients> ingredients);
        public abstract Builder steps(List<Step> steps);
        public abstract Builder servings(int servings);
        public abstract Builder image(String image);

        public abstract Recipe build();
    }
}

現在,我嘗試轉換上面的代碼以實現Parcelable接口,但是,現在我的代碼無法正常工作。 請幫助我將此類轉換為實現Parcelable接口。

@AutoValue
public abstract class Recipe implements Parcelable {
    public static final String ID = "id";
    public static final String NAME = "name";
    public static final String INGREDIENTS = "ingredients";
    public static final String STEPS = "steps";
    public static final String SERVINGS = "servings";
    public static final String IMAGE = "image";

    private int id;
    private String name;
    private List<Ingredients> ingredients;
    private List<Step> steps;
    private int servings;
    private String image;

    public abstract int id();
    public abstract String name();
    public abstract List<Ingredients> ingredients();
    public abstract List<Step> steps();
    public abstract int servings();
    public abstract String image();

    public static Recipe.Builder builder() {
        return new AutoValue_Recipe.Builder();
    }

    public static TypeAdapter<Recipe> typeAdapter(Gson gson) {
        return new AutoValue_Recipe.GsonTypeAdapter(gson);
    }

    public static final class Builder {
        private final ContentValues values = new ContentValues();
        List<Ingredients> ingredient;
        List<Step> step;

        public Recipe.Builder id(int id) {
            values.put(ID, id);
            return this;
        }

        public Builder name(String name) {
            values.put(NAME, name);
            return this;
        }

        public Builder ingredients(List<Ingredients> ingredients) {
        *//*for(int i=0; i<ingredients.size(); i++) {
            values.put(INGREDIENTS, ingredients.get(i).ingredient());
        }*//*
            this.ingredient = ingredients;
            return this;
        }

        public Builder steps(List<Step> steps) {
            *//*for(int i=0; i<steps.size(); i++) {
                values.put(STEPS, steps.get(i));
            }*//*
            this.step = steps;
            return this;
        }

        public Builder servings(int servings) {
            values.put(SERVINGS, servings);
            return this;
        } 

        public Builder image(String image) {
            values.put(IMAGE, image);
            return this;
        }

        public Recipe build() {
            Recipe recipe = null;
            recipe.id = (int) values.get(ID);
            recipe.name = (String) values.get(NAME);
            recipe.ingredients = ingredient;
            recipe.steps = step;
            recipe.servings = (int) values.get(SERVINGS);
            recipe.image = (String) values.get(IMAGE);

            return recipe;
        }
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(name);
        dest.writeList(ingredients);
        dest.writeList(steps);
        dest.writeInt(servings);
        dest.writeString(image);
    }
}

編輯:我將使用修改后的類來處理設備旋轉,以將回收器視圖的滾動狀態保存在片段中。 我的onSaveInstanceState()方法看起來像這樣,

private static final String BUNDLE_RECYCLER_LAYOUT = "BUNDLE_RECYCLER_LAYOUT";
ArrayList<Recipe> mRecipeList = new ArrayList<>(0);

@Override
public void onSaveInstanceState(Bundle bundle) {
    super.onSaveInstanceState(bundle);
   bundle.putParcelable(BUNDLE_RECYCLER_LAYOUT,
   mRecipeListRecyclerView.getLayoutManager().onSaveInstanceState());

   bundle.putParcelableArrayList(BUNDLE_RECYCLER_RECIPE_DATA, mRecipeList);
}

putParcelable內部的第二個參數是Parcelable類型。

我的onCreateView()方法如下所示:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup 
container, @Nullable Bundle savedInstanceState) {

     View view = inflater.inflate(R.layout.fragment_recipe_list, container, false);
    unbinder = ButterKnife.bind(this, view);

    if(savedInstanceState != null) {
        Parcelable savedRecyclerViewState = savedInstanceState.getParcelable(BUNDLE_RECYCLER_LAYOUT);
        mRecipeListRecyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerViewState);
        mRecipeList = savedInstanceState.getParcelableArrayList(BUNDLE_RECYCLER_RECIPE_DATA);
        mRecipeListAdapter.refreshRecipes(mRecipeList);
    } else {
        mRecipeList = getArguments().getParcelableArrayList(BUNDLE_RECYCLER_RECIPE_DATA);
    }

    mRecipeListAdapter = new RecipeListAdapter(getContext(), mRecipeList, recipeId
            -> mRecipeListPresenter.loadRecipeDetails(recipeId));
    mRecipeListAdapter.setHasStableIds(true);

    gridLayoutManager = new GridLayoutManager(getContext(), mGridColumnCount);
    mRecipeListRecyclerView.setLayoutManager(gridLayoutManager);
    mRecipeListRecyclerView.setHasFixedSize(true);
    mRecipeListRecyclerView.setAdapter(mRecipeListAdapter);

    return view;
}

任何幫助都將非常有用,因為我在轉換類以實現Parcelable接口時遇到困難。

        mRecipeListRecyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerViewState);

您不需要調用onRestoreInstanceState() 這已被Android系統自動調用。 此外,您不需要自己保存和還原ArrayList RecyclerView已經為您處理了這些詳細信息。

至於保存滾動位置,您應該做更多的研究。 例如,我發現ListView通過快速搜索跳到屏幕方向更改的頂部 該鏈接有一個明確的示例,該示例演示了如何執行所需的操作。

這個答案是關於ScrollView但是示例代碼與您所需要的非常相似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM