0

我正在構建一個應用程序,我正在使用SQLBrite sql wrapper來處理所有數據庫操作。此外,我使用自動值來自動處理所有使用Google AutoValue庫的getter和setter。如何轉換Android SqlBrite模型類來實現Parcelable

現在,我的問題是處理設備旋轉,並處理我的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接口爲我停留。

+0

你有什麼嘗試,而實施Parcelable?你到底在幹什麼? –

+0

我想實現這個類來實現Parcelable來處理我的設備旋轉,以保存我的RecyclerView中的滾動狀態片段。所以我在onSaveInstanceState裏面的代碼看起來像這樣: @Override public void onSaveInstanceState(Bundle bundle){ super.onSaveInstanceState(bundle); bundle.putParcelable(BUNDLE_RECYCLER_LAYOUT, mRecipeListRecyclerView.getLayoutManager()。onSaveInstanceState()); bundle.putParcelableArrayList(BUNDLE_RECYCLER_RECIPE_DATA, mRecipeList); } –

+0

是的,你在你的問題中說過。我建議你閱讀Parcelable文檔,並做它所說的。如果你已經做了,發生了什麼?我們需要更多的細節來幫助你。 –

回答

0
 mRecipeListRecyclerView.getLayoutManager().onRestoreInstanceState(savedRecyclerViewState); 

您無需致電onRestoreInstanceState()。這已經由Android系統自動調用。此外,您不需要自行保存和恢復ArrayListRecyclerView已經爲您處理這些細節。

至於保存滾動位置,你應該多做一點研究。例如,我發現ListView jumps to the top on screen orientation change有一個快速搜索。這個鏈接有一個明確的例子,說明如何做你想做的事。

This answer約爲ScrollView,但示例代碼與您所需要的非常相似。

+0

謝謝,這是我能得到的最接近的。 –