2011-02-15 85 views
0

我想自定義視圖添加到組視圖與BaseExpandableListAdapterAndroid的自定義視圖和BaseExpandableListAdapter

這是代碼:

自定義視圖和layout.xml

public class InfoView extends View{ 
    private EditText nameEditText; 
    private EditText descriptionEditText; 
    private Spinner goalTypeSpinner; 
    private Spinner categorySpinner; 



    Button addGoalCategoryButton; 
    public InfoView(Context context) { 
     super(context); 
     inflate(context, R.layout.info_panel, parent); 
     nameEditText = (EditText) findViewById(R.id.nameEditText); 

     descriptionEditText = (EditText) findViewById(R.id.descriptionEditText); 

     goalTypeSpinner = (Spinner) 
       findViewById(R.id.goalTypeSpinner); 

     categorySpinner = (Spinner) 
       findViewById(R.id.categorySpinner); 
    } 
} 

infopanel.xml

<LinearLayout 
    android:layout_width="wrap_content" android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" > 
    <Spinner android:id="@+id/goalTypeSpinner" android:prompt="@string/goalType" 
      android:entries="@array/goalTypeList" style="@style/commonText.commonSpinner" > 
    </Spinner> 
    <TableRow style="@style/commonText.commonTableRow"> 

      <Spinner android:id="@+id/categorySpinner" style="@style/commonText.commonSpinner.right" 
       android:prompt="@string/goalType"> 
      </Spinner> 
      <Button android:id="@+id/newCategoryButton" style="@style/commonText.commonButton" 
       android:text="add category" /> 
    </TableRow> 
    <EditText android:id="@+id/nameEditText" android:hint="@string/nameEditTextHint" 
     style="@style/commonText.commonEditText" > 
    </EditText> 
    <EditText android:id="@+id/descriptionEditText" android:hint="@string/descriptionEditTextHint" 
     style="@style/commonText.commonTextArea"> 
    </EditText> 

</LinearLayout> 

在BaseExpandableListAdapter:

.............. 
InfoView infoView; 
public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View convertView, ViewGroup parent) { 

     if (group.equals(INFO) && child.equals(INFO)) { 
      Log.i(TAG, "group INFO(" + group + ")"); 

      if (infoView == null) { 

       // i don't want to recreate everytime 
       // the view so i check if is null   

       infoView = new InfoView(context); 
      } 

      return infoView; 
     } 
........ 

代碼工作(即不拋出任何異常),但不顯示視圖。

你知道嗎爲什麼?

感謝和問候

回答

0

實現getChildView正確的方法是使用所提供的convertView。不要保留在getChildView中創建的任何視圖的引用。

public View getChildView(int groupPosition, int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = new InfoView(context); 
    } 
    return convertView; 
} 
+0

我是正確的...但我想維持一個局部變化我的看法...因爲我有其他視圖控制它,,,像editText和其他類型的輸入控件...我需要來控制我的視圖是否爲空,而不是convertview – 2011-02-16 10:00:32

0

有很多從您發佈的代碼所缺少:當使用infopanel.xml?您如何使用數據填充InfoView的子視圖?等

但是從你發佈,它看起來像你試圖創建什麼是Compound Control。這樣的控件(顯然)需要從佈局中派生,比如LinearLayout,它可以適當地管理子視圖。如果您已經完成了從視圖派生的工作,那麼只有當您在View類中添加了更多的代碼時纔會生效,例如,onMeasureonDraw的實現。

我建議你閱讀Compound Controls的文檔,如果你還沒有。

gngr44's answer也是正確的 - 你不應該試圖以這種方式重用InfoView。請相信Android代碼爲您回收視圖,如果不是null,請使用convertView

+0

infopanel.xml在我的帖子上......謝謝 – 2011-02-16 10:05:14