Ich probiere das Neue aus RecyclerView in Android Lollipop und ich stecke fest.
Ich versuche, eine Liste mit einem Symbol und einem zu erhalten TextView rechts neben dem Symbol, innerhalb von a Fragment.
Ich habe diese tolle Anleitung gefunden wie man a einrichtet RecyclerView. Ich habe jeden Punkt befolgt und nur den geändert item_layout.xml um meinen Bedürfnissen gerecht zu werden.
Das Projekt wird ohne Fehler erstellt, aber wenn es auf meinem Gerät gestartet wird, erhalte ich diesen Fehler:
java.lang.RuntimeException: Aktivität kann nicht gestartet werden ComponentInfo{com.fredrikaldgard.materialcolors/com.fredrikaldgard.materialcolors.MainActivity}: java.lang.NullPointerException: Versuch, die virtuelle Methode „void android.support.v7.widget.RecyclerView. setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)’ auf eine Null-Objektreferenz
Ich habe versucht, das Problem zu googeln, aber ich bin ein ziemlicher Amateur in der Android-Entwicklung.
Hier ist meins 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());
Und meine 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;
}
}
Bearbeiten: Hier ist die 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;
}
}
Was ist möglicherweise schief gelaufen?
Haben Sie noch eine RecyclerView mit ID-Liste in Ihrer XML-Layoutdatei? Wenn nicht, ist die recyclerView-Variable in Schritt 2 null.
– stkent
29. Oktober 2014 um 0:56 Uhr
Ja, ich habe eine RecyclerView in meinem XML mit der ID “list”.
– fredthemugwump
29. Oktober 2014 um 13:44 Uhr
Hätte klarer sein sollen: in der activity_main.xml Datei, oder?
– stkent
29. Oktober 2014 um 14:04 Uhr
@stkent Nun, ich verwende eine Navigationsschublade, die eine Aktivität öffnet, wenn ich auf eines der Elemente in der Schublade klicke. Meine activity_main.xml enthält ein FrameLayout mit der Schublade darin. My RecyclerView befindet sich in einer XML-Datei namens fragment_color.xml.
– fredthemugwump
29. Oktober 2014 um 14:15 Uhr
Der Typ
Dies wurde vor einiger Zeit gefragt, aber basierend auf der Antwort von @nacho_zona3 und früheren Erfahrungen mit Fragmenten besteht das Problem darin, dass die Ansichten zu dem Zeitpunkt, an dem Sie versuchen, sie mit zu finden, noch nicht erstellt wurden findViewById() Methode ein onCreate() Um dies zu beheben, verschieben Sie den folgenden Code:
// 1. get a reference to recyclerView
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);
// 2. set layoutManger
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// this is data from 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());
zu deinem Fragment onCreateView() Anruf. Ein wenig Refactoring ist erforderlich, da alle Variablen und Methoden, die von dieser Methode aufgerufen werden, statisch sein müssen. Der endgültige Code sollte folgendermaßen aussehen:
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);
// 1. get a reference to recyclerView
RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.list);
// 2. set layoutManger
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
// this is data from 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());
return rootView;
}
}
Die Hauptsache hier ist also, dass Sie überall anrufen findViewById() Sie müssen verwenden rootView.findViewById()
Ersetzen Sie dies durch getActivity() .
– swapyonubuntu
6. Oktober 2015 um 17:33 Uhr
Sie könnten auch die RecyclerView aus dem Fragment „onCreateView“ zurückgeben, da das Fragment jetzt im Wesentlichen eine RecyclerView ist
– pcodex
26. Februar 2018 um 0:46 Uhr
Ich bekomme einen Fehler mit MyAdapter mAdapter = new MyAdapter(itemsData); es heißt MyAdapter(android.context.Context, List<>) in MyAdapter kann nicht angewendet werden auf (List<>)
– Learn2Code
17. März 2019 um 4:24 Uhr
Danke bruh. Ich steige gerade wieder in die native Android-Entwicklung ein, nachdem ich vor Jahren meine erste App erstellt habe, die auf v2.3.3 abzielt, und ja … sagen wir einfach, ein oder zwei Dinge haben sich geändert. OH GESETZ
– Muschel
10. November 2019 um 7:21 Uhr
Benutzer4182277
Sie sollten abrufen RecyclerView in einem Fragment nach dem Aufblasen der Kernansicht mit dieser Ansicht. Vielleicht kann es Ihre nicht finden Recycler weil es nicht Teil der Aktivität ist
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_artist_tracks, container, false);
final FragmentActivity c = getActivity();
final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(c);
recyclerView.setLayoutManager(layoutManager);
new Thread(new Runnable() {
@Override
public void run() {
final RecyclerAdapter adapter = new RecyclerAdapter(c);
c.runOnUiThread(new Runnable() {
@Override
public void run() {
recyclerView.setAdapter(adapter);
}
});
}
}).start();
return view;
}
Danke vielmals! Ich habe versucht, meinen Code in meinem Fragment durch Ihren zu ersetzen, aber ich habe ein Problem mit “final FragmentActivity c = getActivity();” Es gibt mir einen Fehler: Erforderlich “android.support.v4.app.FragmentActivity” Gefunden “android.app.Activity”. Ich habe die v4-Unterstützungsbibliothek in meinem Projekt kompiliert.
– fredthemugwump
29. Oktober 2014 um 13:48 Uhr
Sie können jede Aktivität verwenden, Sie müssen die Support-Bibliothek nicht verwenden, wenn Sie sie nicht benötigen
– Benutzer4182277
29. Oktober 2014 um 13:56 Uhr
Was meinst du mit “beliebige Aktivität verwenden”? Ich verwende die Support-Bibliothek sowieso für eine Navigationsschublade.
– fredthemugwump
29. Oktober 2014 um 14:06 Uhr
Ich meinte jede Unterklasse der Aktivitätsklasse. Entschuldigung, dass ich es nicht deutlich gemacht habe.
– Benutzer4182277
29. Oktober 2014 um 14:10 Uhr
Ich muss mich entschuldigen, ich bin nicht sehr gut in komplizierten Dingen wie Fragments. Was genau soll ich anstelle von “final FragmentActivity c = getActivity();” schreiben? Wenn ich FragmentActivity nur durch Activity ersetze, verschwindet der Fehler, aber ich habe immer noch diesen Fehler: imgur.com/amSWNWc
– fredthemugwump
29. Oktober 2014 um 14:22 Uhr
Stellen Sie sicher, dass Sie das richtige Layout haben und dass sich die RecyclerView-ID innerhalb des Layouts befindet. Andernfalls erhalten Sie diesen Fehler. Ich hatte das gleiche Problem, dann bemerkte ich, dass das Layout falsch war.
public class ColorsFragment extends Fragment {
public ColorsFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
==> make sure you are getting the correct layout here. R.layout...
View rootView = inflater.inflate(R.layout.fragment_colors, container, false);
Ich stand vor dem gleichen Problem. Und ich habe die Lösung erhalten, wenn ich diesen Code verwende, um den Kontext aufzurufen. Ich verwende Grid-Layout. Wenn Sie ein anderes verwenden, können Sie es ändern.
Haben Sie noch eine RecyclerView mit ID-Liste in Ihrer XML-Layoutdatei? Wenn nicht, ist die recyclerView-Variable in Schritt 2 null.
– stkent
29. Oktober 2014 um 0:56 Uhr
Ja, ich habe eine RecyclerView in meinem XML mit der ID “list”.
– fredthemugwump
29. Oktober 2014 um 13:44 Uhr
Hätte klarer sein sollen: in der
activity_main.xml
Datei, oder?– stkent
29. Oktober 2014 um 14:04 Uhr
@stkent Nun, ich verwende eine Navigationsschublade, die eine Aktivität öffnet, wenn ich auf eines der Elemente in der Schublade klicke. Meine activity_main.xml enthält ein FrameLayout mit der Schublade darin. My RecyclerView befindet sich in einer XML-Datei namens fragment_color.xml.
– fredthemugwump
29. Oktober 2014 um 14:15 Uhr