1. 程式人生 > >ViewHolder views must not be attached when created. Ensure that you are not passing 'true' to the at

ViewHolder views must not be attached when created. Ensure that you are not passing 'true' to the at

如果在使用Recyclerview的時候出現下面的異常

ViewHolder views must not be attached when created. Ensure that you are not passing ‘true’ to the attachToRoot parameter of LayoutInflate

這說明onCreateViewHolder 方法寫錯了
這句話的意思是,viewHolder不予許在建立的時候新增到parent裡,所以如果在onCreateViewHolder方法裡使用:

// View view = inflater.inflate(R.layout.item_view, parent, true);或者
// View view = inflater.inflate(R.layout.item_view, parent);

就會報錯n: ViewHolder views must not be attached when created. Ensure that you are not passing ‘true’ to the attachToRoot parameter of LayoutInflate

只要改成:
// View view = inflater.inflate(R.layout.item_view, null); 或者
// View view = inflater.inflate(R.layout.item_view, parent, false);
即可

那麼這三個引數是什麼意思呢?

    public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) 

第一個引數是傳入的佈局引數
第二個引數是這個佈局的父佈局
第三個就是是否要將這個佈局載入到父佈局裡

1、如果root為null,那麼第三個引數傳入true和false都無影響,因為當root為null的時候就用不到attachToRoot引數,這個佈局的最外層引數也就沒有效果了。
2、如果root不為null
2.1 attachToRoot = true,佈局的最外層屬性會生效並且會新增到root中,返回的view是父佈局
        View result = root;
        return result;
2.2 attachToRoot = false,佈局會新增到root中,當佈局被新增到root中的時候,佈局的最外層屬性會生效。返回的view是resource指定的佈局
		if (root == null || !attachToRoot) {
			result = temp;
		}
		return result;

完畢(#^ . ^#)