2016-12-15 51 views
1
位置

在我的適配器,我叫LayoutManager.ChildAt(position)得到itemview,但我得到的觀點是不匹配的itemview,當我打電話notifyItemChanged(position),應用程序崩潰:RecyclerView.Adapter GET ItemView控件通過

E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.paicaifu.riches, PID: 8502 
Java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{adb21588 position=0 id=-1, oldPos=-1, pLpos:-1} 
at Android.support.v7.widget.RecyclerView$5.attachViewToParent(RecyclerView.java:654) 
at android.support.v7.widget.ChildHelper.attachViewToParent(ChildHelper.java:239) 
at android.support.v7.widget.RecyclerView.addAnimatingView(RecyclerView.java:1107) 
at android.support.v7.widget.RecyclerView.animateChange(RecyclerView.java:3270) 
at android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3088) 
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2917) 
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283) 
… 
at android.view.Choreographer.doCallbacks(Choreographer.java:574) 

謝謝,這是我的適配器代碼:

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, 
    final int position) { 
    if (holder instanceof CardHolder) { 
     final CardHolder cardHolder = (CardHolder) holder; 
     cardHolder.rootview.setOnClickListener(this); 
     cardHolder.rootview.setTag(position); 
     cardHolder.rootview.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     //get last itemview in adapter,but preView isnot match the 
     //position,it is the visibable views on screen 
     View preView = mLinearLayoutManager.getChildAt(preIndex); 
     //change the datasource 
     mData.getResult().getCardList().get(preIndex).setOpen(false); 
     //update item 
     notifyItemChanged(preIndex);//when the item is out of screen, 
     //this line will cause crashes 
     preIndex = position; 
        } 
      }); 
     } 

我只是想找到的最後一個項目,並改變它的狀態(打開或關閉),如果該項目不在屏幕,notifyItemChanged(INT位置)會出現問題。

+0

嘿,這個問題相當廣泛。你能否把相關的代碼放到適配器,查看者和活動/片段的問題中? – BIW

+0

感謝您的幫助,請原諒我可憐的英語,而不是格式化的代碼,我會在這些方面取得進展 – Bayin

回答

1

這可能有點太晚了,但是當你不在onCreateViewHolder中創建一個新的視圖,而是返回一個已經被膨脹和連接的緩存視圖時,通常會發生崩潰「被調用附着在未分離的孩子上」。

0

我繼承了一個回收站,導致這次崩潰 - 對我來說,將呼叫從notifyItemChanged()更改爲notifyDataSetChanged(),但性能較差,修復了問題。