J'essaie de jouer avec le nouveau RecyclerView et chaque fois que j'essaie de l'exécuter, mon application se bloque immédiatement. Cela me donne NullPointerException pour avoir essayé d'accéder aux méthodes à partir de Android.support.v7.widget.RecyclerView
. J'ai consulté d'autres publications et j'ai constaté que la plupart des gens n'avaient pas compile 'com.Android.support:recyclerview-v7:+'
, mais j'ai essayé, mais cela ne m'a pas aidé. Pas vraiment sûr de savoir quoi faire à ce stade, toute aide serait la bienvenue. Voici le journal des erreurs: (je posterais une photo mais je n'ai pas encore 10 rep)
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)
Ce problème se produit généralement lorsqu'aucune LayoutManager
n'a été fournie pour RecyclerView
. Vous pouvez le faire comme ça:
final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
Dans mon cas, il n'était pas connecté à «final», mais au problème mentionné dans le commentaire de @ NemanjaKovačević à @aga answer . Après avoir déplacé la configuration de layoutManager vers onCreateView de mon fragment, le problème a été résolu.
Quelque chose comme ça:
@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);
Pour moi, j'avais le même problème, le problème était qu'il y avait un RecyclerView inutilisé dans XML avec la vue supprimée, mais je ne le lie pas à un adaptateur dans Activity. Il a été résolu dès que j'ai supprimé ces vues inutilisées du recycleur au format xml.
c'est-à-dire que j'ai supprimé cette vue car elle n'a pas été appelée dans le code ou aucun adaptateur n'a été défini
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/rv_profileview_allactivities"
Android:visibility="gone" />
J'ai rencontré ce crash même si le RecyclerView.LayoutManager
était correctement défini. J'ai dû déplacer le code d'initialisation RecyclerView
dans le rappel onViewCreated(...)
pour résoudre ce problème.
@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);
}
Vous devez utiliser setLayoutManager
dans la méthode RecyclerView#onCreate()
. Avant d’ajouter recyclerView
à une vue, l’ensemble LayoutManager
doit être défini.
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);
Vérifiez avec votre ID de vue du recycleur, en pointant sur la vue réelle du recycleur, le problème a été résolu.
Mon problème était dans mon lyout XML j'ai un Android: animateLayoutChanges mis à true et j'ai appelé notifyDataSetChanged () sur l'adaptateur de RecyclerView dans le code Java.
Donc, je viens de supprimer Android: animateLayoutChanges de ma mise en page et cela a ré-aimé mon problème.
J'ai eu ce problème en raison d'une mauvaise référence de RecyclerView
id.
recyclerView = (RecyclerView) findViewById(R.id.rv_followers_list);
à
recyclerView = (RecyclerView) findViewById(R.id.rv_search_list);
Dans mon cas, j'ai ajouté uniquement la bibliothèque butterknife et j'ai oublié d'ajouter annotationProcessor. En ajoutant la ligne ci-dessous à build.gradle (module App), j'ai résolu mon problème.
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
Je pense que le problème dans votre Adapter
. Assurez-vous d’avoir retourné ViewHolder
dans onCreateViewHolder()
.
@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;
}
J'ai eu ce problème en utilisant la bibliothèque Butterknife . J'avais:
View rootView = inflater.inflate
(R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(rootView);
Mais la version correcte est:
View rootView = inflater.inflate
(R.layout.fragment_recipe_detail_view, container, false);
ButterKnife.bind(this, rootView);
J'utilisais une Dependency Injection - ButterKnife et ce problème s'est posé car je n'avais pas lié la vue.
Donc à l'intérieur onCreate () je viens d'insérer cette ligne:
ButterKnife.bind(this);
Ma déclaration RecyclerView avec injection de dépendance:
@BindView(R.id.recyclerview)
RecyclerView recyclerView;
Recyclerview recylerview = findbyid (R.id.recyclerview) Peut-être l'avez-vous manqué
Dans Gradle implémenter cette bibliothèque:
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'
DansXMLmentionnez comme ceci:
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@+id/recyclerView"/>
Dans Fragment nous utilisons recyclerView
comme ceci:
@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;
}
Dans Activity nous utilisons RecyclerView
comme ceci:
@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);
}
si vous avez besoin de horizontal RecyclerView
, procédez comme suit:
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);
si vous voulez utiliser GridLayoutManager en utilisant RecyclerView
, utilisez comme ceci:
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);
Pour moi, le problème venait de mon activité_main.xml (21) dans laquelle recycleView n'avait pas d'identifiant.
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"
/>
Cela fonctionnait quand j'ai ajouté un Android: id = "@ + id/transac_recycler_view" à activity_main.xml (21) recycleView