Приложение вылетает из за layout manager
public class CaptionedImagesAdapter extends RecyclerView.Adapter<CaptionedImagesAdapter.ViewHolder> {
private String[] captions;
private int[] imageIds;
public CaptionedImagesAdapter(String[] captions, int[] imageIds){
this.captions = captions;
this.imageIds = imageIds;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position){
CardView cardView = holder.cardView;
ImageView imageView = (ImageView)cardView.findViewById(R.id.info_image);
Drawable drawable = ContextCompat.getDrawable(cardView.getContext(), imageIds[position]);
imageView.setImageDrawable(drawable);
imageView.setContentDescription(captions[position]);
TextView textView = (TextView)cardView.findViewById((R.id.info_text));
textView.setText(captions[position]);
}
@Override
public CaptionedImagesAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
CardView cv = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.card_captioned_image, parent, false);
return new ViewHolder(cv);
}
@Override
public int getItemCount(){
return captions.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
private CardView cardView;
public ViewHolder(CardView v){
super(v);
cardView = v;
}
}
}
код адаптера
public class PizzaFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
RecyclerView pizzaRecycler = (RecyclerView)inflater.inflate(R.layout.fragment_pizza, container, false);
String[] pizzaNames = new String[Pizza.pizzas.length];
for (int i = 0; i < pizzaNames.length; i++){
pizzaNames[i] = Pizza.pizzas[i].getName();
}
int[] pizzaImages = new int[Pizza.pizzas.length];
for (int i = 0; i < pizzaImages.length; i++){
pizzaImages[i] = Pizza.pizzas[i].getImageId();
}
CaptionedImagesAdapter adapter = new CaptionedImagesAdapter(pizzaNames, pizzaImages);
pizzaRecycler.setAdapter(adapter);
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
pizzaRecycler.setLayoutManager(layoutManager);
return pizzaRecycler;
}
}
код фрагмента, содержащего RecyclerView и layoutManager. Другие активности/фрагменты не задействуются в смысле этой ошибки, а также не вижу смысла приводить код макета т. к. там тоже все ясно. Еще раз повторюсь, когда убираю layout manager - все работает.
public class Pizza { private String name; private int imageId; public static final Pizza[] pizzas = { new Pizza("Маргорита", R.drawable.margorita), new Pizza("Пицца с грибами", R.drawable.mashrooms) }; private Pizza(String name, int ImageId){ this.name = name; this.imageId = imageId; } public String getName() { return name; } public int getImageId() { return imageId; }}
Этим инициализирую массив imageIds[].
Проблема заключается в том что вылетает приложение при добавлен layout manager любового вида. Для recycler view написан адаптер, код xml для фрагмента также написан, причем раньше приложение не вылетало. Добавляю layout manager - крашится, убираю все ок. Не вижу смысла отправлять код, поэтому отправлю логкат. Надеюсь на решении моей проблемы. Заранее спасибо
Ответы (1 шт):
Думаю, проблема в инициализации pizzas. В момент, когда вы создаете массив, id картинок равны 0x0. Попробуйте создать массив в onCreate и передать его конструктор адаптера. Скорее всего проблема уйдет. Плюс конечно проверьте еще раз картинки.