2016-12-15 82 views
2

我有一個包含多個項目的回收站視圖,並且回收站視圖中的每個項目都包含一個水平回收站視圖。我遇到的問題是佈局管理器爲空。Recycler查看線性佈局管理器返回null

顯示java.lang.NullPointerException:嘗試上的空對象引用

調用虛擬方法 '無效android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView $的LayoutManager)'

這是我的代碼到目前爲止。我檢查了我收到的數據是完好無損的。

RecipeAdapter(主適配器)

public class RecipeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private Context context; 
private List<Object> items; 

private final int RECIPE = 0, JOKE = 1; 

public RecipeAdapter(Context context) { 
    this.context = context; 
    this.items = new ArrayList<>(); 
} 

public void setItems(List<Object> items) { 
    this.items = items; 
} 

public void add(Object object) { 
    items.add(object); 
    notifyItemInserted(items.size()); 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RecyclerView.ViewHolder viewHolder; 
    final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 

    switch (viewType) { 
     case RECIPE: 
      View recipe = inflater.inflate(R.layout.item_recipe, parent, false); 
      viewHolder = new ViewHolder_Recipe(recipe); 
      break; 
     case JOKE: 
      View joke = inflater.inflate(R.layout.item_joke, parent, false); 
      viewHolder = new ViewHolder_Joke(joke); 
      break; 
     default: 
      View recipe_default = inflater.inflate(R.layout.item_recipe, parent, false); 
      viewHolder = new ViewHolder_Recipe(recipe_default); 
      break; 
    } 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    switch (holder.getItemViewType()) { 
     case RECIPE: 
      ViewHolder_Recipe viewHolderRecipe = (ViewHolder_Recipe) holder; 
      configureRecipeHolder(viewHolderRecipe, position); 
      break; 
     case JOKE: 
      ViewHolder_Joke viewHolderJoke = (ViewHolder_Joke) holder; 
      configureJokeHolder(viewHolderJoke, position); 
      break; 
     default: 
      ViewHolder_Recipe viewHolder_recipe_default = (ViewHolder_Recipe) holder; 
      configureRecipeHolder(viewHolder_recipe_default, position); 
      break; 
    } 
} 

private void configureJokeHolder(ViewHolder_Joke viewHolderJoke, int position) { 

} 

private void configureRecipeHolder(ViewHolder_Recipe viewHolderRecipe, int position) { 

    RecipeDetailed recipe = (RecipeDetailed) items.get(position); 

    Glide.with(context) 
      .load(recipe.getImage()) 
      .into(viewHolderRecipe.getRecipe_image()); 

    viewHolderRecipe.getRecipe_name().setText(recipe.getTitle()); 
    viewHolderRecipe.getRecipe_prep().setText(recipe.getReadyInMinutes()); 
    viewHolderRecipe.getRecipe_serves().setText(recipe.getServings()); 

    viewHolderRecipe.getIngredientAdapter().setIngredients(recipe.getExtendedIngredients()); 
} 

@Override 
public int getItemViewType(int position) { 
    if (items.get(position) instanceof RecipeDetailed) { 
     return RECIPE; 
    } else if (items.get(position) instanceof Joke) { 
     return JOKE; 
    } 

    return super.getItemViewType(position); 
} 

@Override 
public int getItemCount() { 
    return items.size(); 
} 

}

的ViewHolder該適配器 - ViewHolder_Recipe

public class ViewHolder_Recipe extends RecyclerView.ViewHolder { 

private CircularImageView recipe_image; 
private TextView recipe_name; 
private TextView recipe_prep; 
private TextView recipe_serves; 
private RecyclerView recyclerView; 
private RecipeIngredientAdapter ingredientAdapter; 

public ViewHolder_Recipe(View itemView) { 
    super(itemView); 
    recipe_image = (CircularImageView) itemView.findViewById(R.id.recipe_image); 
    recipe_name = (TextView) itemView.findViewById(R.id.recipe_name); 
    recipe_prep = (TextView) itemView.findViewById(R.id.recipe_prep); 
    recipe_serves = (TextView) itemView.findViewById(R.id.recipe_serves); 
    recyclerView = (RecyclerView) itemView.findViewById(R.id.recyclerView); 

    ingredientAdapter = new RecipeIngredientAdapter(itemView.getContext()); 
    recyclerView.setLayoutManager(new LinearLayoutManager(itemView.getContext() 
      , LinearLayoutManager.HORIZONTAL, false)); 
    recyclerView.setAdapter(ingredientAdapter); 
} 

public RecipeIngredientAdapter getIngredientAdapter() { 
    return ingredientAdapter; 
} 

public CircularImageView getRecipe_image() { 
    return recipe_image; 
} 

public TextView getRecipe_name() { 
    return recipe_name; 
} 

public TextView getRecipe_prep() { 
    return recipe_prep; 
} 

public TextView getRecipe_serves() { 
    return recipe_serves; 
} 

public RecyclerView getRecyclerView() { 
    return recyclerView; 
} 

}

孩子適配器 - RecipeIngredientAdapter

public class RecipeIngredientAdapter extends RecyclerView.Adapter<ViewHolderRecipeIngredient> { 

private Context context; 
private ArrayList<Ingredient> ingredients; 

public RecipeIngredientAdapter(Context context) { 
    this.context = context; 
} 

public void setIngredients(ArrayList<Ingredient> ingredients) { 
    this.ingredients = ingredients; 
} 

@Override 
public ViewHolderRecipeIngredient onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View view = inflater.inflate(R.layout.item_recipe_ingredients, parent, false); 
    return new ViewHolderRecipeIngredient(view); 
} 

@Override 
public void onBindViewHolder(ViewHolderRecipeIngredient holder, int position) { 

    final Ingredient ingredient = ingredients.get(position); 
    Glide.with(context) 
      .load(ingredient.getImage()) 
      .into(holder.getIngredient_image()); 

} 

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

}

對於該viewholder是一個簡單的viewholder其中包含的圖像。 我在網上看到的帖子似乎做了完全相同的事情,並得到它的工作,我在這裏錯過了什麼?

+0

伴隨着我提交給回收站視圖的錯誤ID,我還忘記更改適配器中的getItemCount()以反映列表大小,因此它始終爲0,並且適配器永遠不會顯示任何數據。 –

回答

3

從錯誤,它聽起來像RecyclerView是空的,而不是佈局管理器。確保您使用佈局中的正確ID。你確定RecyclerView的正確佈局ID是R.id.recyclerView嗎?

+0

我設法解決這個問題,但兒童回收者視圖只是拒絕顯示任何東西,即使數據在那裏,它也不會顯示出來。 –

+0

您絕對不要使用setIngredients方法將數據傳遞到IngredientsAdapter。另外,對於適配器,您通常需要通過將數據傳遞給構造函數來初始化數據。因此,改變IngredientsAdapter的構造函數以獲取2個參數,上下文和數據的ArrayList。 –