2016-12-15 2 views
2

У меня есть просмотр recycler, который содержит несколько элементов, и каждый элемент в представлении recycler содержит горизонтальный просмотр ресайклера. Проблема, с которой я сталкиваюсь, заключается в том, что диспетчер компоновки имеет значение NULL.Recycler View linear layout manager возвращает 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

Наряду с неправильным идентификатором, который я отправлял на просмотр recycler, я также забыл изменить getItemCount() в адаптере, чтобы отобразить размер списка, чтобы он всегда был 0, и адаптер никогда не показывал никаких данных. –

ответ

3

Из-за ошибки это звучит так, как RecyclerView имеет значение null, а не LayoutManager. Убедитесь, что вы используете правильный идентификатор из макета. вы уверены, что правильным идентификатором макета RecyclerView является R.id.recyclerView?

+0

Мне удалось это исправить, но просмотр recycler для ребенка просто отказывается показывать что-либо, даже несмотря на то, что данные есть, он не отображается. –

+0

Вы никогда не передаете данные в IngredientsAdapter с помощью метода setIngredients. Кроме того, с адаптерами вы обычно хотите инициализировать данные, передав их в конструктор. Поэтому смените конструктор IngredientsAdapter на использование 2 аргументов, контекста и массива ArrayList. –

Смежные вопросы