RecyclerView.getChild (index) affiche null lorsque la liste est défilée (l'index est corrompu)
J'ai été en utilisant SwipeableRecyclerView pour mon application android pour permettre le passage des doigts pour mon recyclerView. RecyclerView contient une liste de cardViews.
J'essayais de mettre en œuvre fonction annuler pour les cartes qui vont être supprimés lorsque balayez vers la gauche (premier balayage montre annuler, à côté de balayage déclenche supprimer)
Je suis en train d'essayer le code suivant (en partie à travailler, je suppose)
SwipeableRecyclerViewTouchListener srvTouchListner = new SwipeableRecyclerViewTouchListener(rvTimerList,
new SwipeableRecyclerViewTouchListener.SwipeListener(){
@Override
public boolean canSwipe(int i) {
return true;
}
@Override
public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] ints) {
for(int position : ints){
View view = recyclerView.getChildAt(position);
if (view.getTag(R.string.card_undo) == null) {
if(viewStack == null) {
saveToViewStack(position, view);
final ViewGroup viewGroup = (ViewGroup) view.findViewById(R.id.time_card2);
view.setTag(R.string.card_undo, "true");
viewGroup.addView(view.inflate(TimerSummary.this, R.layout.timeslot_card_undo, null));
}
} else {
Log.d(TAG, "Removing Item");
deleteTimeSlot(timerInstanceList.get(position));
Toast.makeText(TimerSummary.this, "Deleted!", Toast.LENGTH_SHORT).show();
timerInstanceList.remove(position);
finalSummaryAdapter.notifyItemRemoved(position);
}
}
finalSummaryAdapter.notifyDataSetChanged();
}
@Override
public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] ints) {
for (int position:ints){
View view = recyclerView.getChildAt(position);
if(view.getTag(R.string.card_undo) != null && view.getTag(R.string.card_undo).equals("true")){
viewStack = null;
recyclerView.setAdapter(finalSummaryAdapter);
}
}
}
});
lorsque les Éléments sont de plus en plus (besoins de défilement)
View view = recyclerView.getChildAt(position);
renvoie une référence null ce qui provoque une appli crash.
Je doute que je suis en utilisant la méthode incorrecte de la prise de vue. Je devrais être à l'aide de quelque chose en rapport avec viewholder, je suis en fait assez confus sur la façon d'obtenir la vue qui vous voulez à partir de viewholder.
Si quelqu'un peut partager tout ce qui contribue,, ça va être génial!
Je serai heureux de vous fournir plus d'infos si quelqu'un le veut,
source d'informationauteur P-RAD
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
findViewHolderForAdapterPosition
.https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition(int)
Garder à l'esprit qu'il va retourner la valeur null si la position n'est pas aménagé (par exemple, en dehors des limites ou supprimé).
Depuis je n'ai pas assez de points de réputation pour commenter @yigit réponse, j'ai pensé que je donnerais un moyen de récupérer tous les viewHolders à partir d'un RecyclerView indépendamment de ce qui est actuellement dans le viewGroup. Même avec findViewHolderForAdapterPosition et ForLayoutPosition nous pouvons encore obtenir une instance null de la ViewHolder dans le RecyclerView.
Pour contourner cela, nous pouvons utiliser findViewHolderForItemId[1] et transmettre l'ID de la viewHolder dans l'adaptateur à l'aide RecyclerView.Carte#getItemId(int position)[2]
Utilisation findFirstCompletelyVisibleItemPosition() & findLastVisibleItemPosition() méthodes sur LayoutManager de votre RecyclerView à savoir que l'enfant que vous cherchez est visible ou non. S'il est visible, alors vous pouvez utiliser getChild(index) pour obtenir le ViewHolder instance de l'enfant en particulier et elle n'est pas null quoi il pourrait être null(Si l'enfant n'est pas en elle). Dans le cas où votre enfant n'est pas visible que vous venez de faire des changements dans votre situation spécifique des objets de la Liste, la prochaine fois quand il sera visible de mettre à jour l'INTERFACE utilisateur.