Rumah  >  Soal Jawab  >  teks badan

java - RecyclerView异步设置holder时插入新项崩溃

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)
阿神阿神2765 hari yang lalu588

membalas semua(3)saya akan balas

  • 怪我咯

    怪我咯2017-04-18 10:33:31

    Mesej ralat tidak mencukupi untuk menentukan puncanya.

    Semua rangka kerja pemuatan imej tak segerak tidak akan mempertimbangkan isu berikut:

    Sama ada ViewHolder semasa masih ViewHolder sebelum permintaan

    Kedua-dua AdapterView dan RecyclerView mempunyai mekanisme penggunaan semula paparan Pandangan yang digunakan semula mestilah paparan dengan ItemViewType yang sama Memandangkan ItemViewType adalah sama, logik pemprosesan kod pengguna harus sama.

    Jika anda melaksanakan sendiri satu set rangka kerja pemuatan imej tak segerak, anda boleh merujuk kepada dokumen tapak web rasmi Android: Memproses Peta Bit Daripada Benang UI
    Selain itu, tidak disyorkan untuk menduduki atribut teg View, kerana anda mungkin perlu menggunakan tag untuk tujuan lain

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 10:33:31

    Anda melaporkan ralat kerana anda mengemas kini antara muka dalam urutan bukan ui...

    Untuk mengelakkan kekeliruan imej semasa pemuatan tak segerak, anda boleh menambah teg pada paparan dan memutuskan sama ada untuk memuatkannya berdasarkan teg selepas tugas tak segerak selesai.

    balas
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:33:31

    Kaedah ini harus terlebih dahulu menentukan sama ada terdapat cache setempat, dan jika tidak, dapatkannya daripada pelayan. Selepas pemerolehan selesai, kemas kini data yang sepadan dengan penyesuai dan kemas kini senarai.

    balas
    0
  • Batalbalas