Android:具有复杂数据模型的ListView

时间:2009-10-20 15:22:06

标签: android listview adapter

我想将一个“复杂”数据数组映射到ListView。在一个非常简化的形式中,我的数据模型看起来像这样:

class ListPlacesValues {

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

我知道我可以将我的复杂数据转换为HashList,然后只使用SimpleAdapter:

   SimpleAdapter mAdapter = new SimpleAdapter(
     this,
     hashList,
     R.layout.places_listitem,
     new String[] { "name", "city", "country"}, 
     new int[] { R.id.name, R.id.city, R.id.country}
   );  

但是,我宁愿直接使用我的数据模型,但我不知道在哪里以及如何开始,所以最后我可以这样做:

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),这真的很有帮助。

2 个答案:

答案 0 :(得分: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;
}
}

答案 1 :(得分:1)

您链接的示例中的convertView存在一个缺陷

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

您希望将所有动画或未使用的字段设置为null,否则您的项目可能包含数据或动画等待您不想要。