Android中的Spinner的运用。

android提供的列表选择(Spinner)相当于网页上的下拉列表框,通常提供一些固定可选的项供用户去选择。

同样的 如果我们的数据来自于本地,我们可以用 entries属性去指定列表显示的内容。
android:prompt 可以指定Spinner的标题。

通过代码控制Spinner 的展示

mSpinner.performClick();

onNothingSelected方法的调用

当spinner展示的数据源变成空的的时候,会调用此方法

通过entries属性实现Spinner的显示

我们通过entries指定一个array数组内容显示到spinner中,同时用一个按钮去获取Spinner选中的项 。

在values文件夹下的strings.xml里面添加下面的内容,内容要放到标签里面

 <array name="spinnerData">
        <item>第1项</item>
        <item>第2项</item>
        <item>第3项</item>
        <item>第4项</item>
        <item>第5项</item>
        <item>第6项</item>
        <item>第7项</item>
    </array>

然后我们写我们的xml布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_get_selection_item"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="获取选中项" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:entries="@array/spinnerData" />

然后我们在java代码中添加Button的点击事件来获取选中的项的内容

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        //初始化控件
        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
        Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            //spinner.getSelectedItem()就是获取选中的item
                Toast.makeText(MainActivity.this, ""+ spinner.getSelectedItem(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

这样一个简单的Spinner就实现了。

通过ArrayAdapter适配器来显示内容

显示我们之前在strings.xml文件的写的数组内容

首先我们删掉xml文件中spinner下的 android:entries=”@array/spinnerData”这个属性
然后将上面initViews()方法中的代码改为:

 //初始化控件
        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
        Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              //spinner.getSelectedItem()就是获取选中的item
                Toast.makeText(MainActivity.this, ""+ spinner.getSelectedItem(), Toast.LENGTH_SHORT).show();
            }
        });
//创建适配器
        ArrayAdapter<CharSequence> mAdapter = ArrayAdapter.createFromResource(this,R.array.spinnerData,android.R.layout.simple_dropdown_item_1line);
        spinner.setAdapter(mAdapter);

这样也实现了我们上面的功能。

显示我们在java代码中定义的数组内容。

也是只需要将initViews()方法中的代码换为下面的即可:

 //初始化一个string数组,放置spinner中要显示的内容
        String [] data = new String[]{"我是1","我是2","我是3","我是4","我是5","我是6","我是7"};
        //初始化控件
        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
        Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //spinner.getSelectedItem()就是获取选中的item
                Toast.makeText(MainActivity.this, ""+ spinner.getSelectedItem(), Toast.LENGTH_SHORT).show();
            }
        });
        //如果你的jdk不是1.7或者以上,在new 的ArrayAdapter 的<>中,需要声明和前面的类型一致才行。
        ArrayAdapter<String> mAdapter = new ArrayAdapter<>(this,android.R.layout.simple_spinner_item,data);
        //设置列表框下拉时候的样式       mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(mAdapter);

我们用SimpleAdapter实现Spinner的复杂布局的显示

同样我们只修改我们的initViews()方法中的代码:

 //初始化控件
        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
        Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this, "" + spinner.getSelectedItem(), Toast.LENGTH_SHORT).show();
            }
        });

        List<Map<String, String>> data = new ArrayList<>();
        Map<String, String> map1 = new HashMap<>();
        map1.put("name", "刘亦菲");
        map1.put("sex", "女");
        Map<String, String> map2 = new HashMap<>();
        map2.put("name", "李宇春");
        map2.put("sex", "男");
        Map<String, String> map3 = new HashMap<>();
        map3.put("name", "王尼玛");
        map3.put("sex", "基佬");

        data.add(map1);
        data.add(map2);
        data.add(map3);
        //初始化ArrayAdapter 适配器
        SimpleAdapter mAdapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_2, new String[]{"name", "sex"},            //每行显示一组姓名和性别
                new int[]{android.R.id.text1, android.R.id.text2});
        //设置列表框下拉时候的样式
        mAdapter.setDropDownViewResource(android.R.layout.simple_list_item_2);
        spinner.setAdapter(mAdapter);//将适配器设置给ListView

不过这时候我们点击button的时候。获取的是一个json数据,要获取里面的内容就需要去解析json了。

我们修改按钮的点击事件里面的代码去解析json:

 try {
                    JSONObject jo = new JSONObject(spinner.getSelectedItem().toString());
                    String name = jo.optString("name");
                    String sex = jo.optString("sex");
                    Toast.makeText(MainActivity.this, "选中了" + sex + " " + name, Toast.LENGTH_SHORT).show();
                } catch (JSONException e) {
                    e.printStackTrace();
                }

这样我们就分别拿到了性别和姓名两个字段的值。

同理,我们可以用自己写的小布局去适配自己的数据。

自定义适配器去继承BaseAdapter去实现复杂布局

我们还是先贴我们的每一个item的xml文件
    list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="70dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:src="@mipmap/ic_launcher" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:id="@+id/item_tv_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/item_tv_sex"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp" />
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>

我们的布局文件:
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">

    <Button
        android:id="@+id/btn_get_selection_item"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="获取选中项" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:dropDownVerticalOffset="70dp"
         />
</LinearLayout>

我们的适配器为
MyAdapter.java

public class MyAdapter extends BaseAdapter {

    private Context mContext;
    private List<Map<String, String>> data;


    public MyAdapter(Context mContext, List<Map<String, String>> data){
        this.mContext = mContext;
        this.data = data;
    }


    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int i) {
        return data.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder holder;
        if (view ==null){
            holder = new ViewHolder();
            view = LayoutInflater.from(mContext).inflate(R.layout.list_item,null);
            view.setTag(holder);
        }else {
            holder = (ViewHolder) view.getTag();
        }
        holder.mItemName = (TextView) view.findViewById(R.id.item_tv_name);
        holder.mItemSex = (TextView) view.findViewById(R.id.item_tv_sex);
        holder.mItemName.setText(data.get(i).get("name"));
        holder.mItemSex.setText(data.get(i).get("sex"));
        return view;
    }

    public class ViewHolder {
        TextView mItemName;
        TextView mItemSex;
    }
}

我们的Activity为:
MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        //初始化控件
        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
        Button mButton = (Button) findViewById(R.id.btn_get_selection_item);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                //解析json
                    JSONObject jo = new JSONObject(spinner.getSelectedItem().toString());
                    String name = jo.optString("name");
                    String sex = jo.optString("sex");
                    Toast.makeText(MainActivity.this, "选中了" + sex + " " + name, Toast.LENGTH_SHORT).show();
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        });

        List<Map<String, String>> data = new ArrayList<>();
        Map<String, String> map1 = new HashMap<>();
        map1.put("name", "刘亦菲");
        map1.put("sex", "女");
        Map<String, String> map2 = new HashMap<>();
        map2.put("name", "李宇春");
        map2.put("sex", "男");
        Map<String, String> map3 = new HashMap<>();
        map3.put("name", "王尼玛");
        map3.put("sex", "基佬");

        data.add(map1);
        data.add(map2);
        data.add(map3);
        //初始化MyAdapter 适配器
        MyAdapter mAdapter = new MyAdapter(this,data);
        spinner.setAdapter(mAdapter);//将适配器设置给ListView
    }
}

最后放上此种方式的代码 >http://download.csdn.net/detail/qq_27561483/9618354

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值