1 章节目录
3.5 动态加载的选择项(使用ArrayAdapter适配器)
4.9 BottomSheetDialog(可以上下拖动的对话框)
2 适配器
2.1 适配器简介
适配器是一个连接数据源和AdapterView的桥梁,通过它能有效的实现数据源与AdapterView的分离设置,使AdaptereView与数据的绑定更加简便,修改更加方便。
2.2 适配器类别
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
-
ArrayAdapter最为简单,只能展示一行字。
-
SimpleAdapter有最好的扩充性,可以自定义出各种效果。
-
SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
3 Spinner下拉
3.1 Spinner的两种展示样式
下拉列表的展示方式有两种,一种是在当前下拉框的正下方展示列表,此时把spinnerMode属性设置为dropdown;另一种是在页面中部以对话框形式展示列表,此时把SpinnerMode属性设置为dialog。
3.2 Spinner相关方法
-
setPrompt:设置标题文字。
-
setAdapter:设置下拉列表的适配器。
-
setSelection:设置当前选中哪项。注意该方法要在setAdapter方法之后调用。
-
setOnItemSelectedListener:设置下拉列表的选择监听器,该监听器要实现接口OnItemSelectedListener。
3.3 Spinner用法
-
渲染一个Spinner在XML,并通过加载XML文件以及选择项。
-
呈现另一种Spinner的XML,并通过代码动态加载的选择项
3.4 加载XML文件以及选择项
1. 打开“res/values/strings.xml” 文件,定义将在Spinner(下拉列表)显示的项目列表。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">选择一个国家</string>
<string name="country_prompt">Choose a country</string>
<string-array name="country_arrays">
<item>China</item>
<item>United States</item>
<item>Indonesia</item>
<item>France</item>
<item>Italy</item>
<item>Singapore</item>
<item>New Zealand</item>
<item>India</item>
</string-array>
</resources>
2. 打开XML布局文件**activity_main.xml**
-
“android:entries” 代表 spinner 的选择项目。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/country_arrays"
android:prompt="@string/country_prompt" />
</LinearLayout>
3.5 动态加载的选择项(使用ArrayAdapter适配器)
-
XML布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Spinner
android:layout_width="200dp"
android:id="@+id/spinner"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:spinnerMode="dropdown"
android:dropDownVerticalOffset="45dp"
android:background="@null"/>
</LinearLayout>
-
选中文字样式item_select.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"
android:background="@android:color/holo_blue_dark"
android:textSize="14sp"
android:textColor="@android:color/holo_red_light"
android:gravity="center"/>
-
列表其他文字样式item_dropdown.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"
android:textColor="@android:color/black"
android:textSize="14sp"
android:gravity="center"/>
-
Java代码MainActivity.java
public class MainActivity extends AppCompatActivity{
private String[] starArray = {"水星","金星","地球","火星","木星","土星"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initSpinner();
}
private void initSpinner(){
//声明一个下拉列表的数组适配器
ArrayAdapter<String> starAdapter = new ArrayAdapter<String>(this,R.layout.item_select,starArray);
//设置数组适配器的布局样式
starAdapter.setDropDownViewResource(R.layout.item_dropdown);
//从布局文件中获取名叫sp_dialog的下拉框
Spinner sp = findViewById(R.id.spinner);
//设置下拉框的标题,不设置就没有难看的标题了
sp.setPrompt("请选择行星");
//设置下拉框的数组适配器
sp.setAdapter(starAdapter);
//设置下拉框默认的显示第一项
sp.setSelection(0);
//给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的onItemSelected方法
sp.setOnItemSelectedListener(new MySelectedListener());
}
class MySelectedListener implements AdapterView.OnItemSelectedListener{
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this,"您选择的是:"+starArray[i],Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
}
}
3.6 dropdown模式下的列表分割线
只需要在style中添加如下代码即可
添加样式
<style name="XSpinnerStyle" parent="android:Widget.ListView.DropDown">
<!-- 分隔线颜色 -->
<item name="android:divider">#000000</item>
<item name="android:dividerHeight">1dp</item>
</style>
然后在AppTheme中调用
<item name="android:dropDownListViewStyle">@style/XSpinnerStyle</item>
4 Dialog对话框
对话框一般我们就用来提示一些信息给用户,让用户自主选择,或者在一些操作不可逆的情况下我们提示用户是否继续操作
4.1 普通对话框
AlertDialog dialog = new AlertDialog.Builder(this)
.setIcon(R.mipmap.icon)//设置标题的图片
.setTitle("我是对话框")//设置对话框的标题
.setMessage("我是对话框的内容")//设置对话框的内容
//设置对话框的按钮
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "点击了取消按钮", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "点击了确定的按钮", Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
}).create();
dialog.show();
AlertDialog类中有一个静态内部类Builder。所以可以看出对话框使用了一个建造者模式在调用函数的时候就可以一直直点点点链式调用。 需要注意的是:NegativeButton这个按钮是在对话框的左边,PositiveButton在对话框的右边;如果你还想再加一个按钮也是可以的只需要在调用.setNeutralButton("第三个按钮",listener)即可。
4.2 列表对话框
当给用户的选择就那么几条路的时候,就可在对话框上放置一个列表供用户自己选择
final String items[] = {"我是Item一", "我是Item二", "我是Item三", "我是Item四"};
AlertDialog dialog = new AlertDialog.Builder(this)
.setIcon(R.mipmap.icon)//设置标题的图片
.setTitle("列表对话框")//设置对话框的标题
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog