一、使用spinner时遇到的问题
1.传统使用apapter的方法
1
String[] strs = new String[]{};
2
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, strs);
3
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
4
spinner.setAdapter(adapter);
2.使用存在问题,当需要变更adapter数据时,我当时是直接将 strs 的值改变,然后通知adapter进行刷新,以为会和listview平时用法相同,但是结果显示,这样根本无法修改spinner的数据及ui
3.出现这一现象的原因:listview的传值一般是用的 list 集合,对集合进行修改是 list.add() ,这是没问题的,但是我们spinner传递的是striing[],它作为参数传递后,adapter保存的是它的地址值,而你后续再更改 strs ,是将 strs 重新赋值了,但是不影响adapter实际访问的地址,所以没做修改
4.解决方法:将ArrayAdapter的内部类型限制去掉,第三个参数传list,之后可以通过list.add()等方法修改ui显示,示例:
1
List<String> list = new ArrayList<>();
2
ArrayAdapter<> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
3
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
4
spinner.setAdapter(adapter);
二、自定义adapter
1.adapter需继承BaseAdapter
2.其中的getView是定义的spinner的显示选中内容框的布局及具体操作,getDropDownView,是定义的下拉选择框的布局及具体操作
3.示例中是用的同一个布局,只做了textview是否仅显示一行的区分
4.当然可以在布局中自定义间距,大小,颜色等限制
5.使用方法:
1
spinner.setAdapter(new MySpinnerAdapter(this, lists));
1
class MySpinnerAdapter extends BaseAdapter {
2
3
private Context context;
4
private List<String> lists;
5
6
public MySpinnerAdapter(Context context, List<String> lists) {
7
this.context = context;
8
this.lists = lists;
9
}
10
11
@Override
12
public int getCount() {
13
return lists.size();
14
}
15
16
@Override
17
public Object getItem(int position) {
18
return lists.get(position);
19
}
20
21
@Override
22
public long getItemId(int position) {
23
return position;
24
}
25
26
@Override
27
public View getView(int position, View convertView, ViewGroup parent) {
28
View view =
29
LayoutInflater.from(context).inflate(R.layout.item_spinner, null);
30
TextView tv_zlb = (TextView) view.findViewById(R.id.tv_zlb);
31
tv_zlb.setText(lists.get(position));
32
tv_zlb.setSingleLine();
33
tv_zlb.setEllipsize(TextUtils.TruncateAt.END);
34
return view;
35
}
36
37
@Override
38
public View getDropDownView(int position, View convertView, ViewGroup parent) {
39
View view = LayoutInflater.from(context).inflate(R.layout.item_spinner, null);
40
TextView tv_zlb = (TextView) view.findViewById(R.id.tv_zlb);
41
tv_zlb.setText(lists.get(position));
42
return view;
43
}
44
}
另附上简单的item布局
1
<?xml version="1.0" encoding="utf-8"?>
2
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
android:layout_width="wrap_content"
4
android:layout_height="wrap_content"
5
android:orientation="vertical"
6
android:paddingBottom="@dimen/dimen15"
7
android:paddingLeft="@dimen/dimen10"
8
android:paddingTop="@dimen/dimen15">
9
10
<TextView
11
android:id="@+id/tv_zlb"
12
style="@style/text_gray_style"
13
android:layout_width="wrap_content"
14
android:layout_height="wrap_content"
15
android:textColor="@color/black"
16
android:textSize="@dimen/dimen16" />
17
18
</LinearLayout>