2011-06-27 113 views
3

我有一个Android应用程序,其中包含Spinner,并且想用自己的对象动态填充它。这些对象确实已经作为List<T>存在。创建适配器以将对象填充到微调器

的对象是Category类型:

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

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

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

+0

查看以下答案,了解如何在不创建* CustomAdapter *的情况下执行此操作的完整解决方案:http://stackoverflow.com/a/21169383/293280 –

回答

12

这是我的5美分。我有类似的问题。我正在使用实现接口SpinnerAdapter的SimpleCursorAdapter,但是直到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是onItemSelected(AdapterView arg0,View arg1,int position,long id)在OnItemSelectedListener中传递的参数spinner.setOnItemSelectedListener。方法getView inflated spin_layout.xml,标识布局中包含的两个视图并为它们赋值(如String!)。

+0

感谢分享此 – rmirabelle

+0

SimpleCursorAdapter位于android.support.v4包中,因此可以使用它清除回API 4。 –

1

这是一个simple example。不要被“光标”名称所愚弄,它只是使用一个List。这个想法很简单:从BaseAdapter扩展并实现任何缺少的方法(这是一个抽象类);并且不要忘记覆盖getView()方法以提供Category的“可视”表示。