spinner的使用

来源:互联网 发布:mac微信语音导出软件 编辑:程序博客网 时间:2024/05/01 20:21

虽然现在spinner在实际项目中用到的并不是很多,更多的需求还是用自定义popupWindow和dialog的来代替,但是当我们有一些简单的小需求时用spinner快速实现也不失为一种好的选择。

资源文件数组
 <string-array name="area_array">        <item>中国</item>        <item>美国</item>        <item>法国</item>        <item>德国</item>        <item>津巴布韦</item>        <item>韩国</item>        <item>印度</item>    </string-array>

1.直接在xml中使用,一些常用属性

<Spinner        android:layout_marginTop="60dp"        android:id="@+id/spinner"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:entries="@array/area_array"        android:spinnerMode="dialog"        ></Spinner>    <!--android:entries="@array/area_array"属性介绍:entries:表示spinner显示内容直接从资源文件中数组获得-->    <!--android:spinnerMode="dialog"  该属性对应spinner显示的2种模式:1android:spinnerMode="dropdown"下拉模式;2.dialog窗口模式-->    <!--android:prompt="提示内容"      当对应显示为dialog模式时,spinner下拉显示内容顶部的提示内容-->




2.Adapter的使用(常用ArrayAdapter和自定义Adapter(一般继承BaseAdapter))

a.都用系统自带的布局和ArrayAdapter实现的最简单的spinner

public class SimpleSpinnerActivity extends AppCompatActivity{    EditText mArea;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_simple_spinner);        mArea = (EditText) findViewById(R.id.area);        Button step =(Button) findViewById(R.id.step);        step.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(SimpleSpinnerActivity.this, CustomSpinnerActivity.class);                startActivity(intent);            }        });        Spinner spinner = (Spinner) findViewById(R.id.spinner);        final String[] areaArray = getResources().getStringArray(R.array.area_array);        //第二个参数代表spinner为展开时,spinner要显示的样式,这里用系统自带的布局        ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(getApplication(), android.R.layout.simple_spinner_item, areaArray);        //设置spinner展开后每个item布局样式,这里都用系统自带的布局        mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);        spinner.setPrompt("选择国家");//设置提示:显示模式为dialog时有用        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {            @Override            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {                ((TextView) view).setTextColor(0xff00ff00);//改变选择后要显示字体的颜色                mArea.setText(areaArray[position]);            }            @Override            public void onNothingSelected(AdapterView<?> parent) {            }        });        spinner.setAdapter(mAdapter);    }}


b.自定义布局和Adapter实现复杂spinner

1.自定义Adapter
public class MyAdapter extends BaseAdapter {    private Context mContext;    private List<ItemBean> mItemBeans;    private LayoutInflater mInflater;    private OnItemClickListener mOnItemClickListener;    public MyAdapter(Context context, List<ItemBean> itemBeans) {        this.mContext = context;        this.mItemBeans = itemBeans;        mInflater = LayoutInflater.from(mContext);    }    @Override    public int getCount() {        return mItemBeans.size();    }    @Override    public Object getItem(int position) {        return mItemBeans.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    //    SpinnerAdapter//    ListAdapter    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {        this.mOnItemClickListener = onItemClickListener;    }    public interface OnItemClickListener {        void onItemClick(View v, int position);    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        TextView view = (TextView) mInflater.inflate(android.R.layout.simple_spinner_item, parent, false);        view.setBackgroundColor(0xff0000);        return view;    }    @Override    public View getDropDownView(final int position, View convertView, ViewGroup parent) {        LinearLayout view = (LinearLayout) mInflater.inflate(R.layout.item_spinner_layout, parent, false);        ImageView iv = (ImageView) view.findViewById(R.id.iv_item);        final TextView tv = (TextView) view.findViewById(R.id.tv_item);        iv.setImageResource(mItemBeans.get(position).getIv());        tv.setText(mItemBeans.get(position).getTv());//      更具isSelect来设置tv的背景        tv.setSelected(mItemBeans.get(position).isSelect() ? true : false);        tv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (mOnItemClickListener != null) {                    mOnItemClickListener.onItemClick(tv, position);                }            }        });        return view;    }}


2.自定义单选择状态的ItemBean
/** * 用于显示自定义spinner条目的item布局对象 */public class ItemBean {    private int iv;//图片资源,这里放在本地,用int类型,如果是网络上的可以定义成url类型    private String tv;//显示的内容    private boolean isSelect;//是否被选中    public int getIv() {        return iv;    }    public void setIv(int iv) {        this.iv = iv;    }    public String getTv() {        return tv;    }    public void setTv(String tv) {        this.tv = tv;    }    public boolean isSelect() {        return isSelect;    }    public void setIsSelect(boolean isSelect) {        this.isSelect = isSelect;    }    public ItemBean(int iv, String tv, boolean isSelect) {        this.iv = iv;        this.tv = tv;        this.isSelect = isSelect;    }    @Override    public boolean equals(Object o) {        if (this == o)            return true;        if (!(o instanceof ItemBean))            return false;        ItemBean itemBean = (ItemBean) o;        if (getIv() != itemBean.getIv())            return false;        if (isSelect() != itemBean.isSelect())            return false;        return !(getTv() != null ? !getTv().equals(itemBean.getTv()) : itemBean.getTv() != null);    }    @Override    public int hashCode() {        int result = getIv();        result = 31 * result + (getTv() != null ? getTv().hashCode() : 0);        result = 31 * result + (isSelect() ? 1 : 0);        return result;    }    @Override    public String toString() {        return "ItemBean{" +                "iv=" + iv +                ", tv='" + tv + '\'' +                ", isSelect=" + isSelect +                '}';    }}


3.OnCreate自定义myAdapter的使用
public class CustomSpinnerActivity extends Activity {    EditText mArea;    String[] mTvDatas;    ArrayList<ItemBean> mDatas;//MyAdapter数据集合    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_custom_spinner);        initDatas();        initView();    }    private void initDatas() {        mDatas = new ArrayList<>();        mTvDatas = getResources().getStringArray(R.array.area_array);        for (int i = 0; i < mTvDatas.length; i++) {            ItemBean itemBean = new ItemBean(R.mipmap.ic_launcher, "item" + i, i % 2 == 1 ? true : false);            mDatas.add(itemBean);        }    }    private void initView() {        mArea = (EditText) findViewById(R.id.area);        Spinner mSpinner = (Spinner) findViewById(R.id.spinner);        MyAdapter myAdapter = new MyAdapter(this, mDatas);        mSpinner.setAdapter(myAdapter);        mSpinner.setVisibility(View.VISIBLE);        mSpinner.setPrompt("自定义Spinner");        myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {            @Override            public void onItemClick(View v, int position) {                TextView tv = (TextView) v;                Utils.showToast(CustomSpinnerActivity.this, tv.getText().toString().trim());                mArea.setText(tv.getText().toString().trim());            }        });        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {            @Override            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {                TextView tv=(TextView)view;                tv.setTextColor(0xff00ff00);            }            @Override            public void onNothingSelected(AdapterView<?> parent) {            }        });    }}

下面是项目的Demo源码:有需要的自行下载http://download.csdn.net/detail/themelove/9326159

在写Demo过程中对Adapter又有了新一步的认识:
1.Adapter(顶层接口)其下分ListAdapter和SpinnerAdapter
2.BaseAdapter(抽象类)实现了ListAdapter和SpinnerAdapter
3.BaseAdapter有一些常用的默认子类:SimpleAdapter;ArrayAdapter,CursorAdapter

下面是Adapter体系的结构关系图







0 0
原创粉丝点击