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.
Vous devez vous connecter pour publier un commentaire.
Cela a été demandé il y a quelques temps maintenant, mais basé sur la réponse de @nacho_zona3 fourni, et de l'expérience précédente avec des fragments, le problème est que les points de vue n'ont pas été créés par le temps que vous essayez de les trouver avec la
findViewById()
méthode dansonCreate()
pour résoudre ce problème, déplacez le code suivant:à votre fragment de la
onCreateView()
appel. Une petite quantité de refactoring est nécessaire, car toutes les variables et les méthodes appelées par cette méthode doivent être statiques. Le code final doit ressembler à:Donc, la chose principale ici est que n'importe où que vous appelez
findViewById()
vous aurez besoin d'utiliserrootView.findViewById()
MyAdapter mAdapter = new MyAdapter(itemsData);
il dit MyAdapter(android.contexte.Contexte, List<>) dans MyAdapter ne peut pas être appliqué à (List<>)Vous devez récupérer des
RecyclerView
dans unFragment
après avoir gonflé noyau de Vue à l'aide de ce point de Vue. Peut-être il ne peut pas trouver votre recycleur parce qu'il ne fait pas partie de l'ActivitéAssurez-vous que vous avez la bonne mise en page, et que le RecyclerView id est à l'intérieur de la mise en page. Sinon, vous obtiendrez cette erreur. J'ai eu le même problème, puis j'ai remarqué que la mise en page est erronée.