创建适配器以使用对象填充Spinner

时间:2011-06-27 19:26:13

标签: android object spinner adapter

我有一个带有Spinner的Android应用程序,并希望用我自己的对象动态填充它。这些对象确实已作为List<T>存在。

对象属于Category

public class Category implements Serializable {
    private Long id;
    private String name;

    // constructors
    // getter & setter
    // hashCode, equals
    // toString
}

我知道我必须写一个适配器。我怎么做?我试图找一些例子......没有运气。请指教。

3 个答案:

答案 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转换为数组是微不足道的,所以这可能会指向正确的方向。

http://developer.android.com/resources/samples/Spinner/src/com/android/example/spinner/SpinnerActivity.html

祝你好运。