Ich versuche, mich mit dem neuen RecyclerView zu beschäftigen, und wenn ich versuche, es auszuführen, stürzt meine App sofort ab. Es gibt mir NullPointerException für den Versuch, auf Methoden von Android.support.v7.widget.RecyclerView
zuzugreifen. Ich habe mir andere Posts angesehen und gesehen, dass die meisten Leute compile 'com.Android.support:recyclerview-v7:+'
nicht hatten, aber ich habe es versucht und es hat überhaupt nicht geholfen. Nicht wirklich sicher, was zu diesem Zeitpunkt zu tun ist, wäre jede Hilfe dankbar. Hier das Fehlerprotokoll: (Ich würde ein Bild posten, aber ich habe noch keine 10 Wiederholungen)
Java.lang.NullPointerException: Attempt to invoke virtual method 'void Android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(Android.support.v7.widget.RecyclerView$Recycler, Android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
at Android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.Java:1764)
at Android.view.View.measure(View.Java:17430)
at Android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.Java:727)
at Android.widget.RelativeLayout.onMeasure(RelativeLayout.Java:463)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1436)
at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:722)
at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:613)
at Android.view.View.measure(View.Java:17430)
at Android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.Java:851)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1436)
at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:722)
at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:613)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1436)
at Android.widget.LinearLayout.measureVertical(LinearLayout.Java:722)
at Android.widget.LinearLayout.onMeasure(LinearLayout.Java:613)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:5463)
at Android.widget.FrameLayout.onMeasure(FrameLayout.Java:430)
at com.Android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.Java:2560)
at Android.view.View.measure(View.Java:17430)
at Android.view.ViewRootImpl.performMeasure(ViewRootImpl.Java:2001)
at Android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.Java:1166)
at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1372)
at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1054)
at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5786)
at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:767)
at Android.view.Choreographer.doCallbacks(Choreographer.Java:580)
at Android.view.Choreographer.doFrame(Choreographer.Java:550)
at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:753)
at Android.os.Handler.handleCallback(Handler.Java:739)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:135)
at Android.app.ActivityThread.main(ActivityThread.Java:5221)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:898)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:693)
Dieses Problem tritt normalerweise auf, wenn keine LayoutManager
für die RecyclerView
angegeben wurde. Sie können es so machen:
final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
In meinem Fall war es nicht mit 'final' verbunden, sondern mit dem in @ NemanjaKovačević kommentierten Problem an @aga answer . Ich hatte einen LayoutManager für das Laden von Daten festgelegt, und das war der Grund für den gleichen Absturz. Nachdem das LayoutManager-Setup auf onCreateView meines Fragments verschoben wurde, wurde das Problem behoben.
Etwas wie das:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
...
mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler);
mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLayoutManager);
Für mich hatte ich das gleiche Problem. Das Problem bestand darin, dass es in xml eine ungenutzte RecyclerView-Ansicht gab, deren Ansicht jedoch weg war. Ich binde sie jedoch nicht an einen Adapter in Activity. Es wurde behoben, sobald ich solche ungenutzten Ansichten des Recyclers in xml entfernt hatte
ich habe diese Ansicht entfernt, da diese nicht im Code aufgerufen wurde oder ein Adapter festgelegt wurde
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/rv_profileview_allactivities"
Android:visibility="gone" />
Ich habe diesen Absturz erlebt, obwohl ich den RecyclerView.LayoutManager
richtig eingestellt hatte. Ich musste den Initialisierungscode RecyclerView
in den Callback onViewCreated(...)
verschieben, um dieses Problem zu beheben.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_listing, container, false);
rootView.setTag(TAG);
return inflater.inflate(R.layout.fragment_listing, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new ListingAdapter(mListing);
mRecyclerView.setAdapter(mAdapter);
}
Sie müssen setLayoutManager
in der RecyclerView#onCreate()
-Methode verwenden. Vor dem Hinzufügen von recyclerView
zu einer Ansicht muss die LayoutManager
festgelegt sein.
private RecyclerView menuAsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
menuAsList = (RecyclerView) findViewById(R.id.recyclerView_mainMenu);
menuAsList.setLayoutManager(new LinearLayoutManager(Home.this));
}
recyclerView =
(RecyclerView) findViewById(R.id.recycler_view2);
Erkundigen Sie sich bei Ihrer Recycler-View-ID und zeigen Sie auf die tatsächliche Recycler-Ansicht, die mein Problem gelöst hat
Mein Problem war in meinem XML-Lyout. Ich habe ein Android: animateLayoutChanges auf true gesetzt und notifyDataSetChanged () auf dem RecyclerView-Adapter im Java-Code aufgerufen.
Also habe ich gerade Android: animateLayoutChanges aus meinem Layout entfernt und damit mein Problem behoben.
Ich habe dieses Problem aufgrund einer falschen Referenz von RecyclerView
id erhalten.
recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);
zu
recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);
In meinem Fall habe ich nur die Buttermesser-Bibliothek hinzugefügt und vergessen, annotationProcessor hinzuzufügen. Indem ich die folgende Zeile zu build.gradle (App-Modul) hinzufügte, löste sich mein Problem.
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
Ich denke, das Problem in Ihrer Adapter
. Stellen Sie sicher, dass Sie ViewHolder
in onCreateViewHolder()
. Zurückgegeben haben.
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_leaderboard, parent, false);
ViewHolder view_holder = new ViewHolder(v);
return view_holder;
}
Ich hatte dieses Problem bei der Verwendung der Butterknife-Bibliothek ...
View rootView = inflater.inflate
(R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(rootView);
Die korrekte Version ist jedoch:
View rootView = inflater.inflate
(R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(this, rootView);
Ich benutzte ein Dependency Injection - ButterKnife und dieses Problem entstand, weil ich die Ansicht nicht gebunden hatte.
Also habe ich in onCreate () gerade diese Zeile eingefügt:
ButterKnife.bind(this);
Meine RecyclerView-Deklaration mit Abhängigkeitsinjektion:
@BindView(R.id.recyclerview)
RecyclerView recyclerView;
Da LinearLayoutManager standardmäßig vertikal ist, ist dies einfacher:
recyclerView.setLayoutManager(new LinearLayoutManager(context));
Wenn Sie die Ausrichtung ändern möchten, können Sie diesen Konstruktor verwenden:
public LinearLayoutManager(Context context, int orientation, boolean reverseLayout);
Recyclerview recylerview = findbyid (R.id.recyclerview) Vielleicht haben Sie es verpasst
In Gradle Implementiere diese Bibliothek:
implementation 'com.Android.support:appcompat-v7:SDK_VER'
implementation 'com.Android.support:design:SDK_VER'
implementation 'com.Android.support:support-v4:SDK_VER'
implementation 'com.Android.support:support-v13:SDK_VER'
implementation 'com.Android.support:recyclerview-v7:SDK_VER'
InXMLwie folgt erwähnen:
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/recyclerView"/>
In Fragment verwenden wir recyclerView
wie folgt:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.YOUR_LAYOUT_NAME, container, false);
RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
APICallMethod();
YOURADAPTER = new YOURADAPTER(getActivity(), YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
recyclerView.setAdapter(YOURADAPTER);
return rootView;
}
In Activity verwenden wir RecyclerView
wie folgt:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.YOUR_LAYOUT_NAME);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
APICallMethod();
YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
recyclerView.setAdapter(YOURADAPTER);
}
wenn Sie horizontal RecyclerView
benötigen, machen Sie folgendes:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
APICallMethod();
YOURADAPTER = new YOURADAPTER(ACTIVITY_NAME.this, YOUR_LIST); // you can use that adapter after for loop in response(APICALLMETHOD)
recyclerView.setAdapter(YOURADAPTER);
wenn Sie GridLayoutManager verwenden möchten, verwenden Sie RecyclerView
so:
RecyclerView recyclerView = findViewById(R.id.rvNumbers);
recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // 3 is number of columns.
adapter = new MyRecyclerViewAdapter(this, data);
recyclerView.setAdapter(adapter);
Für mich war das Problem mit meiner activity_main.xml (21), in der das recycleView keine ID hatte.
activity_main.xml (21)
<Android.support.v7.widget.RecyclerView
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_marginStart="8dp"
Android:layout_marginLeft="8dp"
Android:layout_marginTop="8dp"
Android:layout_marginEnd="8dp"
Android:layout_marginRight="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button3"
tools:listitem="@layout/transaction_list_row" />
activity_main.xml
<Android.support.v7.widget.RecyclerView
Android:id="@+id/transac_recycler_view"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_marginStart="8dp"
Android:layout_marginLeft="8dp"
Android:layout_marginTop="8dp"
Android:layout_marginEnd="8dp"
Android:layout_marginRight="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button3"
/>
Es hat funktioniert, als ich ein Android: id = "@ + id/transac_recycler_view" zu der Activity_main.xml (21) recycleView hinzugefügt habe