说到选择样式widgets我们得首先要了解Android adapters,它为选择样式的widgets提供常规数据接口。最简单的adapter是使用ArrayAdapter,如下所示:
String[] items={“this”,”is”,”a”,”really”,”silly”,”list”};
new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
ArrayAdapter构造器有三个参数:
- The Context to use (typically this will be your activity instance) ,是你的activity实例。
- 要使用的view的资源ID。
- 要显示的包含数据的数组。
1.ListView:最经常用到列表 widget要算ListView了,在代码中调用setAdapter()来设置显示数据和子视图,并且通过调用setOnItemSelectedListener()来监听选择项的改变。当然如果你的activity中只有一个单独的列表框,你可以使activity继承于ListActivity,你也不需要改变布局,列表会填满屏幕。如果你想自己定义布局,你可以在ListView中定义id为”@android:id/list”,ListActivity会知道哪个 widget是activity的主列表。下面看一个实例:
xml代码:
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent” >
<TextView android:id=”@+id/selection”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>
<ListView android:id=”@android:id/list”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:drawSelectorOnTop=”false”
/>
</LinearLayout>
java代码:
public class NowActivity extends ListActivity {
/** Called when the activity is first created. */
TextView selection;
String[] items={“lorem”, “ipsum”, “dolor”, “sit”, “amet”,
“consectetuer”, “adipiscing”, “elit”, “morbi”, “vel”,
“ligula”, “vitae”, “arcu”, “aliquet”, “mollis”,
“etiam”, “vel”, “erat”, “placerat”, “ante”,
“porttitor”, “sodales”, “pellentesque”, “augue”, “purus”};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items));
selection=(TextView)this.findViewById(R.id.selection);
}
public void onListItemClick(ListView parent,View v,int position,long id){
selection.setText(items[position]);
}
}
- 在java代码中可以调用ListView的setChoiceMode()来改变选择模式,支持的值有CHOICE_MODE_SINGLE或者CHOICE_MODE_MULTIPLE,在ListActivity中你可以通过调用 getListView()来获取ListView。
- ArrayAdapter的构造函数中参数android.R.layout.simple_list_item_1值之外,还可以使用android.R.layout.simple_list_item_single_choice或者android.R.layout.simple_list_item_multiple_choice。
- 可以调用ListView的getCheckedItemPositions()来获取已经选定项的位置。
2.Spinner:在android中Spinner相当于下来列表框。像ListView一样,可以通过调用setAdapter()来为数据和子视图提供adapter。当下拉列表显示时如果你想要调整视图,你需要通过配置adapter而不是Spinner widget。使用setDropDownViewResource()方法为使用的视图提供资源ID,使用xml来设置自己的下拉列表样式。看下面的代码:
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>
<TextView android:id=”@+id/selection”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>
<Spinner android:id=”@+id/spinner”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>
</LinearLayout>
java代码:
public class NowActivity extends Activity implements OnItemSelectedListener {
TextView selection;
String[] items={“lorem”, “ipsum”, “dolor”, “sit”, “amet”,
“consectetuer”, “adipiscing”, “elit”, “morbi”, “vel”,
“ligula”, “vitae”, “arcu”, “aliquet”, “mollis”,
“etiam”, “vel”, “erat”, “placerat”, “ante”,
“porttitor”, “sodales”, “pellentesque”, “augue”, “purus”};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
selection=(TextView)this.findViewById(R.id.selection);
Spinner spin=(Spinner)this.findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);
ArrayAdapter<String> aa=new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item,items);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);//在这里可以是自己定义的xml样式
spin.setAdapter(aa);
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position,
long id) {
selection.setText(items[position]);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
selection.setText(“”);
}
}
3.GridView:
- android:numColumns:有多少列,或者你可以设置值”auto_fit”,android会根据可用空间自动计算。
- android:verticalSpacing和android:horizontalSpacing: 指出在grid中两项之间的空白间隔。
- android:columnWidth:指出列的宽度。
- android:stretchMode:缩放与列宽大小同步。
举个例子,如果你的屏幕有320px宽度,你设置android:columnWidth=”100px” 和android:horizontalSpacing=”5px”,android:numColumns=”3”,那么3列使用310px(3个 100px列宽和2个5px间隔)。如果android:stretchMode=”columnWidth”,那么3个列的宽度都会相应增加来分配掉剩余的10px,如果android:stretchMode=”spacingWidth”,则空白间隔会增加来分配剩余的10px。
看示例:
xml代码:
<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>
<TextView android:id=”@+id/selection”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>
<GridView android:id=”@+id/grid”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:verticalSpacing=”35px”
android:horizontalSpacing=”5px”
android:numColumns=”auto_fit”
android:stretchMode=”columnWidth”
android:gravity=”center”
/>
</LinearLayout>