2013-07-10 62 views
0
@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     ListViewItem item = items.get(position);  

     View vi=convertView; 
     if(position == 0) { 
      vi = inflater.inflate(R.layout.setting_twolinetext_checkbox, null); 
      TextView tvRowTitle = (TextView) vi.findViewById(R.id.tvRowTitle); 
      TextView tvRowDesc = (TextView) vi.findViewById(R.id.tvRowDesc); 
      CheckBox cbCheckBox = (CheckBox) vi.findViewById(R.id.cbRowCheckBox); 

      tvRowTitle.setText(item.Title); 
      tvRowDesc.setText(item.Description); 
      return vi; 
     } else { 

      TwoLineListItem twoLineListItem = (TwoLineListItem) vi; <----- here is the error 

      TextView text1 = twoLineListItem.getText1(); 
      TextView text2 = twoLineListItem.getText2(); 

      text1.setText(item.Title); 
      text2.setText(item.Description); 
      return vi; 
     } 


    } 

07-10 13:55:37.082: E/AndroidRuntime(10520): java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TwoLineListItem 
07-10 13:55:37.082: E/AndroidRuntime(10520): at com.example.util.CustomSettingsListViewAdapter.getView(CustomSettingsListViewAdapter.java:69) 

有其他人有這個問題只是清理他們的項目,它的工作原理......也許我的問題是不同的。任何想法,爲什麼它會給我這個問題?LinearLayout不能投射到android.widget

+0

秀TwoLineListItem碼 – wtsang02

回答

0

這就是說進入的視圖是LinearLayout類型。但是你希望在這一點上它是一個TwoLineListItem。由於TwoLineListItem不是一個LinearLayout它抱怨。也許你只需要弄清楚爲什麼在這個位置上你會得到一個線性佈局。也許你也想跳過位置1。

0

這看起來像來自適配器的代碼片段。如果由適配器管理列表中的項目可以有不同的看法類型的情況下,你應該重寫getViewTypeCount()和getItemViewType(INT位置)

你的代碼看起來有點像:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    ListViewItem item = items.get(position); 

    int itemViewType = getViewType(position); 

    View vi=convertView; 
    if(itemViewType == 0) { 
     // Viewtype 0 is a linear layout? 
     if(! (vi instanceof LinearLayout)) { 
      // Cant reuse existing view, inflate a new one.. 
      vi = inflater.inflate(R.layout.setting_twolinetext_checkbox, null); 
     } 
     TextView tvRowTitle = (TextView) vi.findViewById(R.id.tvRowTitle); 
     TextView tvRowDesc = (TextView) vi.findViewById(R.id.tvRowDesc); 
     CheckBox cbCheckBox = (CheckBox) vi.findViewById(R.id.cbRowCheckBox); 

     tvRowTitle.setText(item.Title); 
     tvRowDesc.setText(item.Description); 

    } else if(itemViewType == 1) { 
     // TwoLineListItem 
     if(!vi instanceof TwoLineListItem) { 
      // Can't reuse layout, inflate a new one.. 
      vi = inflater.inflate(R.layout.twolinelistitem, null); 
     } 

     TwoLineListItem twoLineListItem = (TwoLineListItem) vi; 
     TextView text1 = twoLineListItem.getText1(); 
     TextView text2 = twoLineListItem.getText2(); 

     text1.setText(item.Title); 
     text2.setText(item.Description); 

    } 

    return vi; 
} 

值得注意的是,convertView實際上是從ListAdapter的「recycle」bin中檢索的,以便在滾動列表時嘗試和減少分配/ GC的數量。您應該在嘗試使用它之前檢查convertView中的視圖類型,如果它不是您需要的,則創建一個新的佈局。

getItemViewType(position)應返回列表中位置的視圖類型編號。在你的情況可能會更簡單,直接在你的getView做,但這樣做「正確的」,你可以後來決定,如果你想擁有的意見混合..如:

現在

@Override 
int getItemViewType(int position) { 
    if(position == 0) { 
    return 0; 
    } else { 
    return 1; 
    } 
} 

未來:

@Override 
int getItemViewType(int position) { 

    SpecialData item = (SpecialData) getItem(position); 

    if(item.isTwoLineItem()) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 
相關問題