2012-07-15 47 views
14

我有一個列表適配器, ,它完美..但後來我的ListView不能爲主題的..Android ClassCastException - 從LayoutLabout從LinearLayout到AbsListView

public View getView(int position, View convertView, ViewGroup parent) { 
     //System.gc(); 
     TextView tv; 

     LayoutInflater inflater = getLayoutInflater(); 

     View row = View.inflate(mContext,R.layout.item,null); //.inflate(R.layout.item, parent, false); doesnt work either.. 
     String id = null; 
     if (convertView == null) { 
      tv = (TextView) row.findViewById(R.id.TextView01);; 
     } else 
      tv = (TextView) convertView; 

[..]

logcat

我得到這個..

07-15 19:45:51.710: ERROR/AndroidRuntime(20185): FATAL EXCEPTION: main 
     java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 
     at android.widget.ListView.setupChild(ListView.java:1827) 
     at android.widget.ListView.makeAndAddView(ListView.java:1794) 
     at android.widget.ListView.fillDown(ListView.java:688) 

我item.xml文件如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_height="wrap_content" 
      android:gravity="left|center" 
      android:layout_width="fill_parent" 
      android:paddingBottom="15px" 
      android:background="#fff200" 
      android:paddingTop="15px" 
      android:paddingLeft="15px"> 

<TextView android:id="@+id/TextView01" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="40px" 
      android:textStyle="bold" 
      android:layout_marginLeft="20px" 
      android:textColor="#0099CC"> 
</TextView> 
</LinearLayout> 
+0

任何一個可以幫助http://stackoverflow.com/questions/30951608/java-lang-classcastexception-android-view-viewgrouplayoutparams-cannot-be -cast – Aditya 2015-06-20 09:44:34

回答

33

該問題是由在線性佈局中包裹從適配器返回的控件引起的。丟失佈局文件中的LinearLayout(只需將TextView作爲根),我認爲它應該可以工作。

要輕鬆擴展:您正在創建控件,然後將其添加到LinearLayout中。此時將爲其分配LinearLayout $ LayoutParams對象並將其設置爲其佈局參數。然後將其拉出線性佈局,並將其放入您的列表視圖中,該視圖不理解LinearLayout $ LayoutParams。

或者,從getView返回行而不是(因爲我認爲你現在正在做,因爲你已經從你的引用代碼中刪除返回行)返回電視。 (另一個不相關的提示:你膨脹你的佈局,然後在convertView!= null時拋棄它;這會導致慢速設備的滾動性能不佳,只有在你真的需要時才執行通貨膨脹。 )

+0

是的!它的工作..但正如你所說,滾動有點生硬..我怎麼平滑它沒有通貨膨脹?就像我如何在沒有充氣的情況下獲得列表的自定義佈局?我不明白丟棄的部分..它如何被丟棄?這份清單的URI來源是來自mediastore .. – 2012-07-15 16:48:46

+3

謝謝你這個@Jules,它有助於理解這個問題! 如果你仍然想使用電視對象,你可以做的另一件事是設置它的佈局參數是一個AbsListView.LayoutParams的實例,即: tv.setLayoutParams(new AbsListView.LayoutParams(width,height); – 2013-05-25 05:31:18

+0

「或者,從getView返回行,而不是(因爲我認爲你現在正在做,因爲你已經從你引用的代碼中刪除返回行)返回電視。「這就像一個魅力。謝謝。 – ElaGorilaki 2014-03-31 17:53:51

0

與ArrayAdapter的getView攜手合作,驗證碼的正確方法是這樣的:

public View getView(int position, View convertView, ViewGroup parent) { 
    //System.gc(); // Should not manually call gc 
    View row; 
    LayoutInflater inflater = getLayoutInflater(); 
    if (convertView == null) { 
     row = inflater.inflate(R.layout.item, parent, false); 
    } else 
     row = convertView; 

    TextView tv = (TextView) row.findViewById(R.id.TextView01); 

而且,不是做手工收集的垃圾在你的代碼,如果可能。

+0

nope,仍然收到相同的錯誤。如果我把**電視=新的TextView(mContext.getApplicationContext()); **在if語句中,只有它是工作,但不呈現我所需的XML文件.. – 2012-07-15 16:07:59

5

您是否嘗試使用佈局充氣器來充氣靜態xml佈局?像這樣:

LayoutInflater li = LayoutInflater.from(context); 
View rootView = li.inflate(R.layout.item, null); 
+0

nope,抱歉..不能找出原因,但其仍然顯示相同的錯誤.. – 2012-07-15 16:17:00

20

你可能正在返回的不是行的電視

public View getView(int position, View convertView, ViewGroup parent) { 
    TextView tv; 

    LayoutInflater inflater = getLayoutInflater(); 
    View row = View.inflate(mContext,R.layout.item,null); 
    String id = null; 
    if (convertView == null) { 
     tv = (TextView) row.findViewById(R.id.TextView01);; 
    } else 
     tv = (TextView) convertView; 
    } 
return row; // returning tv brings to ClassCast! 
0

這是正確的:

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    final ViewHolder holder; 

    if(view==null){ 
     vi = inflater.inflate(R.layout.listview_row_myvideos,null); 
     holder = new ViewHolder(); 
     holder.tv = (TextView) vi.findViewById(R.id.TextView01); 

     vi.setTag(holder); 
    }else{ 
     holder = (ViewHolder)vi.getTag(); 
    } 
    return vi; 
} 

public class ViewHolder{ 
    TextView tv; 
} 
0

我有同樣的問題,我用這些代碼:

public View getView(final int position, View convertView, ViewGroup parent) { 
    convertView = G.layoutInflater.inflate(R.layout.list_lay_cities_markets, null); 

    // your work 

    notifyDataSetChanged(); 
    return convertView; 
} 
相關問題