我有一个带有Spinner
的Android应用程序,并希望用我自己的对象动态填充它。这些对象确实已作为List<T>
存在。
对象属于Category
:
public class Category implements Serializable {
private Long id;
private String name;
// constructors
// getter & setter
// hashCode, equals
// toString
}
我知道我必须写一个适配器。我怎么做?我试图找一些例子......没有运气。请指教。
答案 0 :(得分:12)
这是我的5美分。我遇到了类似的问题。我正在使用SimpleCursorAdapter,它实现了SpinnerAdapter接口,但只到SDK版本11(Android 3.0)才到达。我打算将我的应用程序与SDK 8(Android 2.2)一起使用,因此我不得不将SimpleCursorAdapter替换为另一个或我自己的。真正的挑战者是我还为微调器使用了自定义XML布局,并在其中显示了光标的几个字段,即光标适配器。所以这是经过大量研究后的解决方案,而且信息并不容易。
以下是名为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并在构造函数中传递,并与包含微调器的活动一起传递。
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是OnItemSelectedListener中为 spinner.setOnItemSelectedListener 在 onItemSelected (AdapterView arg0,View arg1,int position,long id )中传递的参数。方法 getView 膨胀 spin_layout.xml ,标识布局中包含的两个视图并为其指定值(如String!)。
答案 1 :(得分:1)
这是simple example。不要被“游标”名称所迷惑,它只是使用List。这个想法很简单:从BaseAdapter
扩展并实现任何缺少的方法(它是一个抽象类);并且不要忘记覆盖getView()
方法以提供Category
的“视觉”表示。
答案 2 :(得分:-1)
我不确定这是否有帮助,但Android SDK有一个很好的例子,可以从数组向Spinner提供数据。将List转换为数组是微不足道的,所以这可能会指向正确的方向。
祝你好运。