Afficher un RecyclerView du Fragment

Je suis à essayer les nouvelles RecyclerView dans Android Lollipop et je suis coincé.

Je suis en train de recevoir une liste, avec une icône et un TextView à droite de l'icône, à l'intérieur d'un Fragment.

J'ai trouvé ce tutoriel sur comment mettre en place un RecyclerView. J'ai suivi tous les points et a changé le item_layout.xml pour l'adapter à mes besoins.

Le projet s'appuie sans aucune erreur, mais quand il se lance sur mon appareil, j'obtiens cette erreur:

java.lang.RuntimeException: Impossible de démarrer l'activité ComponentInfo{com.fredrikaldgard.materialcolors/com.fredrikaldgard.materialcolors.MainActivity}: java.lang.NullPointerException: Tentative d'invoquer la méthode virtuelle " void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)"sur un objet null référence

J'ai essayé de google le problème, mais je suis un amateur avec des développement Android.

Voici mon MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //1. get a reference to recyclerView
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);

    //2. set layoutManger
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    //this is data fro recycler view
    ItemData itemsData[] = { new ItemData("Indigo",R.drawable.circle),
            new ItemData("Red",R.drawable.color_ic_launcher),
            new ItemData("Blue",R.drawable.indigo),
            new ItemData("Green",R.drawable.circle),
            new ItemData("Amber",R.drawable.color_ic_launcher),
            new ItemData("Deep Orange",R.drawable.indigo)};


    //3. create an adapter
    MyAdapter mAdapter = new MyAdapter(itemsData);
    //4. set adapter
    recyclerView.setAdapter(mAdapter);
    //5. set item animator to DefaultAnimator
    recyclerView.setItemAnimator(new DefaultItemAnimator());

Et mon MyAdapter:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private ItemData[] itemsData;
public MyAdapter(ItemData[] itemsData) {
this.itemsData = itemsData;
}
//Create new views (invoked by the layout manager)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
//create a new view
View itemLayoutView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_layout, null);
//create ViewHolder
ViewHolder viewHolder = new ViewHolder(itemLayoutView);
return viewHolder;
}
//Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
//- get data from your itemsData at this position
//- replace the contents of the view with that itemsData
viewHolder.txtViewTitle.setText(itemsData[position].getTitle());
viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl());
}
//inner class to hold a reference to each item of RecyclerView
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView txtViewTitle;
public ImageView imgViewIcon;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
}
}
//Return the size of your itemsData (invoked by the layout manager)
@Override
public int getItemCount() {
return itemsData.length;
}
}

Edit: Voici la Fragment

public class ColorsFragment extends Fragment {
public ColorsFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_colors, container, false);
return rootView;
}
}

Ce qui a peut-être mal tourné?

  • Avez-vous encore une RecyclerView avec l'id de la liste dans votre xml fichier de mise en page? Si pas, le recyclerView variable sera nulle à l'étape 2.
  • Oui, j'ai un RecyclerView dans mon xml avec l'id "liste".
  • Aurait dû être plus clair: dans le activity_main.xml fichier, non?
  • Eh bien, j'utilise un nav-tiroir qui s'ouvre à une activité lorsque je clique sur l'un des objets dans le tiroir. Mon activity_main.xml contient un FrameLayout avec le tiroir à l'intérieur. Mon RecyclerView est à l'intérieur d'un fichier XML appelé fragment_color.xml.