Spinner使用所遇问题及自定义adapter

本文介绍Spinner组件的正确使用方法,包括如何避免数据更新时UI不刷新的问题,并提供自定义Adapter的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、使用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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值