2013-01-22 100 views
0

我有一個列表視圖,它使用ArrayAdapter從webservice填充。 Web服務爲我提供了我需要的所有數據。有些僅僅是純文本瀏覽器,而EditText和spinners之間則有其他替代方案。我很容易地展示它們,並在EditText字段中填充它們到期的值。Mono for Android:微調列表視圖

問題出在填補微調器的價值。我可以在適配器中定義適配器嗎?另外我的數據來自web服務,作爲一個字符串傳遞的XML。

我的微調代碼到目前爲止我Adapter.cs內:

if (item.FieldType == "OptionBOX") 
    { 
     Spinner SpinnerValue = (Spinner) view.FindViewById<Spinner>(Resource.Id.spinnerVal); 
     SpinnerValue.Visibility = view.Visibility == ViewStates.Invisible ? ViewStates.Invisible : ViewStates.Visible; 

     bool isReadOnly = bool.Parse(item.isReadOnly); 

     if (isReadOnly == true) 
     { 
      SpinnerValue.Enabled = false; 
      SpinnerValue.Focusable = false; 
      SpinnerValue.FocusableInTouchMode = false; 
     } 
    } 

我的數據,微調是item.optbox_options內。

從我的XML更容易理解的表格:

<Table diffgr:id="Table5" msdata:rowOrder="4"> 
<IdRec>5</IdRec> 
<FieldId>1026</FieldId> 
<FieldDesc>stanje rezervoarja</FieldDesc> 
<FieldType>ComboBOX</FieldType> 
<isReadOnly>true</isReadOnly> 
<FieldValue>6</FieldValue> 
<FieldTextValue>2/4</FieldTextValue> 
<OptBox_Options> 
<Options><myOPT FieldValue="1" FieldTextValue="0"/><myOPT FieldValue="2" FieldTextValue="1/4"/><myOPT FieldValue="6" FieldTextValue="2/4"/><myOPT FieldValue="7" FieldTextValue="3/4"/><myOPT FieldValue="8" FieldTextValue="4/4"/></Options> 
</OptBox_Options> 
</Table> 

所以只是爲了澄清我的需求和慾望: 我可以使用適配器中的適配器,如果我能 - 怎麼樣? 如何顯示OptBox_Options行的數據?我需要在我的spinners中顯示FieldTextValue列中的值。

回答

0

使用解決:

List<string> entries = new List<string>(); 

String rawXML = item.OptBox_Options; 

StringReader stream = null; 
XmlTextReader reader = null; 

DataSet xmlDS = new DataSet(); 
stream = new StringReader(rawXML); 
// Load the XmlTextReader from the stream 
reader = new XmlTextReader(stream); 
xmlDS.ReadXml(reader); 

DataSet myOPTvalues = new DataSet(); 
myOPTvalues = xmlDS; 

foreach (DataRow row in myOPTvalues.Tables[0].Rows) 
{ 
    var optItem = new PrevzemSpin(); 
    optItem.FieldValue = row["FieldValue"].ToString(); 
    if (optItem.FieldValue.Equals("")) optItem.FieldValue = null; 

    optItem.FieldTextValue = row["FieldTextValue"].ToString(); 
    if (optItem.FieldTextValue.Equals("")) optItem.FieldTextValue = null; 

    entries.Add(optItem.FieldTextValue); 
    SpinnerValue.Tag = optItem.FieldValue; 
} 
1

爲什麼您認爲不可能在您的自定義Adapter內的某個地方爲您的ListView實例化一個Adapter以在其中填充內容?您可以簡單地在Adapter之外執行Adapter,Spinner,ListView

然後你只需要想出一個去耦方式通過Adapters層次來傳遞數據,使各級得到你想要的數據。

不過,我不認爲ListView設計模式適合於這種互動的,你可能會與不會被解僱的觸摸事件的問題。我覺得一個ExpandableListView是設計模式爲你想達到什麼樣的一個比較明智的選擇,也就有了更好的可用性。

你可以找到一個ExpandableListView這裏的一個例子:ExpandableListView Mono for Android