以下是我的建议。我曾遇到类似的问题。我使用的是实现了SpinnerAdapter接口的SimpleCursorAdapter,但该组件只能在SDK版本11(Android 3.0)及以上使用。然而,我希望我的应用程序能够在SDK 8(Android 2.2)及更高版本上运行,因此我不得不替换SimpleCursorAdapter为另一个适配器或自己编写适配器。真正的挑战是,我还使用了自定义的XML布局来显示spinner中从光标即cursor适配器中获取的多个字段。经过大量调研后,这是我的解决方案,而且相关信息并不容易获得。
以下是用于spinner的布局文件spin_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/field1"
android:textColor="#000"
android:gravity="center"
android:layout_width="40dp"
android:layout_height="wrap_content"
android:textSize="24sp" />
<TextView
android:id="@+id/field2"
android:textColor="#000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp" />
</LinearLayout>
这里是实现SpinnerAdapter并继承(使用作为小助手)BaseAdapter的适配器。最初使用的Cursor已转换为List,并与包含Spinner的活动一起在构造函数中传递。
public class MyCursorAdapter extends BaseAdapter implements SpinnerAdapter{
private Activity activity;
private List<BusLines> list_bsl;
public MyCursorAdapter(Activity activity, List<BusLines> list_bsl){
this.activity = activity;
this.list_bsl = list_bsl;
}
public int getCount() {
return list_bsl.size();
}
public Object getItem(int position) {
return list_bsl.get(position);
}
public long getItemId(int position) {
return list_bsl.get(position).getId();
}
public View getView(int position, View convertView, ViewGroup parent) {
View spinView;
if( convertView == null ){
LayoutInflater inflater = activity.getLayoutInflater();
spinView = inflater.inflate(R.layout.spin_layout, null);
} else {
spinView = convertView;
}
TextView t1 = (TextView) spinView.findViewById(R.id.field1);
TextView t2 = (TextView) spinView.findViewById(R.id.field2);
t1.setText(String.valueOf(list_bsl.get(position).getLine_Num()));
t2.setText(list_bsl.get(position).getName());
return spinView;
}
}
与网上其他解决方案不同的是,getItemId 方法建立了与数据库中 id 字段的链接,就像 SimpleCursorAdapter 一样。该 id 是传递给 spinner.setOnItemSelectedListener 中 OnItemSelectedListener 的 onItemSelected(AdapterView arg0, View arg1, int position, long id) 方法的参数。方法 getView 膨胀了 spin_layout.xml,识别出布局中包含的两个视图,并将它们分配值(作为字符串!)。