java - RecyclerView异步设置holder时插入新项崩溃
阿神
阿神 2017-04-18 10:31:31
0
3
547

viewholder有一个textview和imageview
textview显示用户姓名
imageview显示用户头像

在onbindviewholder时会根据item的id向服务器请求该用户的信息
由于请求是异步的,当请求成功回调设置textview和imageview的时候列表插入新信息,就会报错

错误信息如下:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{a2d62b7 position=2 id=-1, oldPos=1, pLpos:1 scrap [attachedScrap] tmpDetached no parent}
    at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5046)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5177)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5158)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2061)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1445)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3330)
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3186)
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3632)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1799)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
    at android.view.View.layout(View.java:15718)
    at android.view.ViewGroup.layout(ViewGroup.java:5039)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2129)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1886)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1103)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5949)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
    at android.view.Choreographer.doCallbacks(Choreographer.java:601)
    at android.view.Choreographer.doFrame(Choreographer.java:571)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
    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:5308)
    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:913)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:708)
阿神
阿神

闭关修行中......

répondre à tous(3)
刘奇

Le message d'erreur est insuffisant pour déterminer la cause.

Tous les frameworks de chargement d'images asynchrones ne prendront pas en compte le problème suivant :

Si le ViewHolder actuel est toujours le ViewHolder avant la demande

AdapterView et RecyclerView ont tous deux un mécanisme de réutilisation des vues. La vue réutilisée doit être une vue avec le même ItemViewType. Puisque le ItemViewType est le même, la logique de traitement du code utilisateur doit être la même.

Si vous implémentez vous-même un ensemble de cadres de chargement d'images asynchrones, vous pouvez vous référer au document du site officiel d'Android : Traitement des bitmaps hors du fil de l'interface utilisateur
De plus, il n'est pas recommandé d'occuper l'attribut de balise de View, car vous devrez peut-être utiliser la balise à d'autres fins

.
洪涛

Vous signalez une erreur car vous mettez à jour l'interface dans un fil de discussion non-ui...

Afin d'éviter toute confusion d'image lors du chargement asynchrone, vous pouvez ajouter une balise à la vue et décider de la charger en fonction de la balise une fois la tâche asynchrone terminée.

大家讲道理

Cette méthode doit d'abord déterminer s'il existe un cache local, et sinon, l'obtenir auprès du serveur. Une fois l'acquisition terminée, mettez à jour les données correspondant à l'adaptateur et mettez à jour la liste.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!