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

谢谢,这是我能得到的最接近的。 –