2016-08-01 175 views
1

我不斷收到錯誤:ClassCastException異常的layoutInflater.inflate(...)

java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to android.widget.LinearLayout 

每當執行以下操作:

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); 
    LinearLayout mLinearLayout = (LinearLayout) layoutInflater.inflate(R.layout.item, parent, false); 
    return new ViewHolder(mLinearLayout); 
} 

當是沒有意義的,因爲這是我的xml文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:orientation="vertical" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/item_text_view"/> 

</LinearLayout> 

因此,XML文件的根應該是LinearLayout,所以inflater應該返回LinearLayout,其中我它獲取FrameLayout?

+0

這是佈局文件夾中名爲'item'的文件的xml嗎? – Vucko

+0

是的。 [15chars] – CaptainForge

+1

你爲什麼需要演員?只需使用'View v = inflater.inflate' –

回答

2

更換

LinearLayout mLinearLayout = (LinearLayout) layoutInflater.inflate(R.layout.item, parent, false); 
return new ViewHolder(mLinearLayout); 

通過

View view = layoutInflater.inflate(R.layout.item, parent, false); 
return new ViewHolder(view); 

編輯

ViewHolder公共構造需要一個View不是LinearLayout。如果您需要訪問一個孩子這樣的佈局,像LinearLayout你要訪問它從findViewById的,例如:

你的項目佈局

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/your_linear_layout_id" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/item_text_view"/> 

</LinearLayout> 

你ViewHolder

public class ExampleViewHolder extends RecyclerView.ViewHolder{ 

    public ExampleViewHolder(View itemView) { 
     super(itemView); 
     LinearLayout linearLayout = (LinearLayout) itemView.findViewById(R.id.your_linear_layout_id); 
    } 
} 

onCreateViewHolder

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = layoutInflater.inflate(R.layout.item, parent, false); 
    return new ViewHolder(view); 
} 
+0

閱讀上面的評論。似乎LinearLayout可能是必需的 –