android学习,spinner

Android (27) 2024-01-27 11:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说android学习,spinner,希望能够帮助你!!!。

下拉菜单 ,在任何程序里都是个很重要的东西,spinner和listview有点相似,先做个简单的例子吧。

在activity_main里添加spinner。

<Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginTop="44dp"
        android:entries="@array/spingarr"
        android:background="#00ff00"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

再在values目录下的strings.xml里添加字符数组。

<string-array name="spingarr">
        <item>北京</item>
        <item>上海</item>
        <item>广州</item>
        <item>深圳</item>
    </string-array>

这样,一个简单的spinner就设置完成了。当然需要在里面添加选择事件监听。下面的代码添加到onCreate的里面。

       TextView tv=findViewById(R.id.hello);//得到textView控件
        Spinner myspinner = findViewById(R.id.spinner);//得到spinner控件
				//选择监听
        myspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String strs[]=getResources().getStringArray(R.array.spingarr);//得到字符串数组
                tv.setText("your choice is "+strs[position]);//把选取的相应的项目的字符赋值给TextView。
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

下面再来个能实际应用的复杂一点的:

首先也是在activity_main里添加一个spinner组件。

<Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="1dp"
        android:layout_marginLeft="1dp"
        android:layout_marginTop="10dp"
        android:background="#ff00ff"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

这时,这个spinner控件里没有任何内容,内容在MainActivity里添加。

在添加之前,需要准备一个数据类,一个适配类。

public class Person {

    public Person(String name, String city, int age) {
        this.name = name;
        this.city = city;
        this.age = age;
    }

    String name;
    String city;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class MyAdapter extends BaseAdapter {//继承自BaseAdapter类,需要重写下面4个方法,
  //为了能把数据传进来,设置了一个数据类对象和一个上下文对象
    private List<Person> data;
    private Context context;

    //实例化对象的时候就把需的内容传进来。
    public MyAdapter(List<Person> data, Context context) {
        this.data = data;
        this.context = context;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder vh
        if(convertView==null) {//如果当前没有界面对象传进来。
            vh=new ViewHolder();
            LayoutInflater layoutInflater = LayoutInflater.from(context);
            convertView = layoutInflater.inflate(R.layout.show_item, parent, false);//得到当前的listitem界面
            vh.tvname=convertView.findViewById(R.id.tv_name);
            vh.tvcity=convertView.findViewById(R.id.tv_city);
            vh.tvage=convertView.findViewById(R.id.tv_age);
            convertView.setTag(vh);//标记并保存这个内部类对象。
        }else{
            vh= (ViewHolder) convertView.getTag();//取出标记的内部类对象。
        }
        vh.tvname.setText(data.get(position).getName());
        vh.tvcity.setText(data.get(position).getCity());
        vh.tvage.setText(String.valueOf(data.get(position).getAge()));//此处如果不是字符会报错
        return convertView;
    }
		//设置这个内部final类,是为了减少程序重复。
    private final class ViewHolder{
        TextView tvname;
        TextView tvcity;
        TextView tvage;
    }

}

以上两个类写好了,再在onCreate里添加以下内容。

List<Person> personList=new ArrayList<Person>();//创建类集合,
				//填充数据到类集合,
        personList.add(new Person("张三", "上海 ",20));
        personList.add(new Person("李四", "上海 ",32));
        personList.add(new Person("王五", "北京" ,18));
        personList.add(new Person("赵六", "广州 ",28));
				
				Spinner spinner=findViewById(R.id.spinner);//得到当前的spinner对象
        spinner.setAdapter(new MyAdapter(personList,this));//新建适配类并关联到spinner对象
				//给spinner对象添加一个已选择对象的事件监听。
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                //通过spinner的适配对象得到当然的数据类对象
          			Person person = (Person) spinner.getAdapter().getItem(position);
                Log.e("liao", "onItemSelected: "+person.name+"    " +person.city+"    "+
                        person.age);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

这个数据集里需要一个person类,建立一个

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复