1. 程式人生 > >使用RecyclerView中引發 java.lang.IllegalStateException: Cannot call this method while RecyclerView is com

使用RecyclerView中引發 java.lang.IllegalStateException: Cannot call this method while RecyclerView is com

報錯內容

出錯原因

在介面卡onBindViewHolder(….)方法裡呼叫了notifyItemChanged(position),導致RecyclerView還沒有渲染完滑動引發的

錯誤程式碼

 @Override
    public void onBindViewHolder(final ContentViewHolder holder, final int position) {
    .....

 holder.et_Number.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
public void onFocusChange(View view, boolean b) { //TODO 問題就是我通過Log列印日誌發現這個onBindViewHolder()載入資料時會一直渲染,導致notifyItemChanged(position)一直在迴圈,就會導致滑動時還沒渲染完就呼叫這方法了 if(!b){ //焦點失去時重新整理 notifyItemChanged(position); } }} ...... }

我的解決方法

int myPosition = -1;
 @Override
    public void onBindViewHolder(final ContentViewHolder holder, final int position) {
    .....

 holder.et_Number.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                // TODO 在外面定義個變數myPosition ,當myPosition 不等於position就執行notifyItemChanged(position),這樣的話每次就只執行一次了,再執行專案滑動失去焦點重新整理就OK了
if(!b){ //焦點失去時重新整理 if(myPosition == position) return; myPosition = position notifyItemChanged(position); } }} ...... }