2009-10-20 49 views
4

我想將一組「複雜」數據映射到ListView。在一個非常簡化的形式我的數據模型看起來就像是這樣的:Android:具有複雜數據模型的ListView

class ListPlacesValues { 

    String idObject; 
    String name; 
    String city; 
    String country; 
    ArrayList<String> classification; 
    double distance_quantity; 
    DistanceUnit distance_unit; 
      [...more stuff ...] 
} 

我知道,我可以把複雜的數據轉換成HashList,然後只用一個SimpleAdapter:

然而,我寧願直接使用我的數據模型,但我不知道在哪裏以及如何開始,所以在最後我可以做這樣的事情:

ArrayList<ListPlacesValues> values = getData(); 
MyAdapter mAdapter = new MyAdapter(
      this, 
      values, 
      R.layout.places_listitem, 
      ListPlacesValues { values.name, values.city, values.country}, 
      new int[] { R.id.name, R.id.city, R.id.country} 
); 

解決方案:我發現這個Android API示例(List14),這真的很有幫助。

+0

Stefan,List14鏈接現在被破壞;這裏是一個工作:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html – ohhorob 2010-09-28 22:09:12

+0

謝謝ohhorob。現在更新:-) – znq 2010-09-29 11:34:08

回答

4

您可以擴展ArrayAdapter。這裏是你的代碼示例。在這個例子中 - SearchItem是一些自定義的POJO。基本上你需要重寫getView()方法,通過膨脹排佈局,然後根據項目清單和當前位置填充值來建立自己的行

class SearchItemsAdapter extends ArrayAdapter<SearchItem> { 
Activity context; 
List<SearchItem> items; 
SearchHeader header; 

@SuppressWarnings("unchecked") 
public SearchItemsAdapter(final Activity context, 
     final Map<SearchHeader, List<SearchItem>> result) { 
    super(context, R.layout.item, (List) ((Object[]) result.values() 
      .toArray())[0]); 
    this.context = context; 
    this.header = result.keySet().iterator().next(); 
    this.items = result.get(this.header); 
} 

@Override 
public View getView(final int position, final View convertView, 
     final ViewGroup parent) { 
    final View view = this.context.getLayoutInflater().inflate(
      R.layout.item, null); 
    final SearchItem item = this.items.get(position); 
    ((TextView) view.findViewById(R.id.jt)).setText(item.jt); 
    ((TextView) view.findViewById(R.id.dp)).setText(item.dp); 
    ((TextView) view.findViewById(R.id.cn)).setText(item.cn); 
    ((TextView) view.findViewById(R.id.loc)).setText(item.loc.name); 
    final TextView body = ((TextView) view.findViewById(R.id.e)); 
    body.setText(item.e); 
    body.setTag(item.src[0]); 
    ((TextView) view.findViewById(R.id.src)).setText(item.src[1]); 
    return view; 
} 
} 
+0

謝謝。這有很大幫助。我剛剛找到的這個API示例也非常有幫助:http://developer.android.com/guide/samples/ApiDemos/src/com/example/android/apis/view/List14.html – znq 2009-10-22 08:52:49

+0

當然你不想要像這樣實現getView(),它只是一個例子(使用convertView)。 – Matthias 2009-11-02 13:18:08

+1

當你擴展'ArrayAdapter'時,你不需要維護自己的'items'列表。你所要做的就是調用'add'。如果您想維護自己的存儲空間,請使用'BaseAdapter' – 2011-03-21 23:55:42

1

有一個缺陷與convertView您鏈接

樣品中
if(convertView != null){ //reuse 
    convertView.setAnimation(null); 
    convertView.setAnyCustomFieldsIdontWantFilledWithData(null); 
} 

你想要設置所有的動畫或未使用的字段爲空,否則你的項目可能會有數據或動畫等待你不想要的。