0

Je crée une disposition de vue rapide et y ajoute une vue recycleur. Mon code est ci-dessous:RecyclerView - Ajouter une ligne à l'adaptateur de manière dynamique

swipeRefreshLayout = new SwipeRefreshLayout(activity); 
theme = new ContextThemeWrapper(activity, R.style.ScrollBarRecyclerView); 
recyclerView = new RecyclerView(theme); 

linearLayoutManager = new LinearLayoutManager(activity); 
recyclerView.setLayoutManager(linearLayoutManager); 
swipeRefreshLayout.addView(recyclerView); 
recyclerView.setAdapter(dataAdapter); 

J'essaie d'ajouter une ligne (item listview) dynamiquement. La hauteur de chaque rangée peut être différente. J'implémente une classe d'adaptateur en surchargeant les méthodes onCreateViewHolder, onBindViewHolder, getCount et getItemViewType.

public void addItem() { 
    // add item to items 
    dataAdapter.notifyItemInserted(items.length-1); 
} 

Fonctionne pour 3-4 articles. Lorsque le défilement est nécessaire pour afficher plus de lignes, l'application se bloque. Sortie du logcat est ici:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{126d708 position=4 id=-1, oldPos=3, pLpos:3 scrap [attachedScrap] tmpDetached no parent} 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5046) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5177) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5158) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2061) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1445) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3330) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3186) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1595) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4560) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:683) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:616) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:751) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6077) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
09-25 13:54:23.406 12444 12444 E AndroidRuntime: at 

com.android.internal.os.ZygoteInit.main (ZygoteInit.java:755)

Comment puis-je ajouter l'article à la vue recycleur sur scrollable de manière dynamique?

+0

appelez-vous la méthode addItem après la collecte de modifications dans l'adaptateur? Pouvez-vous partager le code de votre adaptateur? –

+0

Ma classe d'adaptateur (particulièrement onBindViewHolder) est trop longue. Je ne pouvais pas l'ajouter. J'ai une liste d'articles. Je crée un modèle sur onCreateViewHolder, personnalise la ligne (texte, image) dans onBindViewHolder. –

+0

Avant d'appeler notifyItemInserted, ajoutez-vous également l'élément à l'ensemble de données de l'adaptateur? –

Répondre

0

Ajoutez un item dans votre itemlist à partir de votre activité, puis appelez simplement mAdapter.notifyDatasetChanged(); C'est tout.