创建适配器以使用对象填充下拉列表。

4

我有一个Android应用程序,其中包含一个Spinner,我想动态地使用自己的对象填充它。这些对象已经存在于List<T>中。

这些对象的类型为Category

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

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

我知道我需要编写一个适配器(Adapter),但是应该怎么做呢?我尝试找了一些例子...可惜没有找到。请给予建议。


请查看以下答案,了解如何在不创建CustomAdapter的情况下完成此操作的完整解决方案:https://dev59.com/ZHI-5IYBdhLWcg3w483k#21169383 - Joshua Pinter
3个回答

12

以下是我的建议。我曾遇到类似的问题。我使用的是实现了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,识别出布局中包含的两个视图,并将它们分配值(作为字符串!)。


SimpleCursorAdapter位于android.support.v4包中,因此您可以将其用在API 4及更早版本上。 - M Granja

1
这是一个简单的例子。不要被“cursor”名称所迷惑,它只是使用了一个列表。思路很简单:从BaseAdapter扩展并实现任何缺失的方法(它是一个抽象类);别忘了重写getView()方法来提供你的Category的“视觉”表示。

-1

该示例从布局中的数组填充Spinner,而不是动态创建。这样的答案毫无意义! - Gangnus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接