当前位置:   article > 正文

Android 自定义下拉列表_android 标签下拉列表选择

android 标签下拉列表选择

Android 下拉列表也是一个比较常用的控件,但是Android自带的下拉框样式效果较差,没办法,只好自己来自定义一个。其实主要是利用弹窗来实现的,看一下效果图先~~


我这边仅仅是实现简单的自定义控件,简单易懂,布局上有需要其他效果如边框、虚线等可自行加上。下拉列表是List,所以item也是可以根据需要进行内容上的丰富,修改适配器便可以。

好了,进入正题。首先,我们先创建一个标题及箭头布局,目的是用于点击后弹出下拉菜单。,代码如下所示:

接下来,创建下拉列表ListView布局,代码如下:
创建ListView,自然也要对应创建其Item的布局,代码如下:
接下来,我们来封装一个自定义控件MySpinerView,由于我没有去找向上箭头的图片资源,大家箭头自行替换。代码如下:
  1. package com.newland.myspinerdemo;
  2. import android.content.Context;
  3. import android.graphics.Color;
  4. import android.util.AttributeSet;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.WindowManager;
  8. import android.widget.ImageView;
  9. import android.widget.LinearLayout;
  10. import android.widget.RelativeLayout;
  11. import android.widget.TextView;
  12. import java.util.List;
  13. /**
  14. * 封装好的下拉列表,包括头部
  15. */
  16. public class MySpinerView extends LinearLayout implements View.OnClickListener, MySpinerAdapter.IOnItemSelectListener {
  17. private String mExampleString = "";
  18. private int mExampleColor = Color.RED;
  19. private float mExampleDimension = 0;
  20. private Context context;
  21. private RelativeLayout spiner;
  22. private TextView tvSpiner;
  23. private ImageView ivSpiner;
  24. private List
  25. nameList;
  26. private MySpinerPopWindow mSpinerPopWindow;
  27. public MySpinerView(Context context, AttributeSet attrs) {
  28. super(context, attrs);
  29. this.context = context;
  30. LayoutInflater.from(context).inflate(R.layout.sample_my_spiner_view, this);
  31. init(attrs, 0);
  32. spiner = (RelativeLayout) this.findViewById(R.id.spiner);
  33. spiner.setOnClickListener(this);
  34. tvSpiner = (TextView) this.findViewById(R.id.tv_spiner);
  35. ivSpiner = (ImageView) this.findViewById(R.id.iv_spiner);
  36. }
  37. /**
  38. * 设置弹出下拉表单的数据,在Activity那边得到控件后记得调用否则抛异常
  39. * @param nameList
  40. */
  41. public void setData(List
  42. nameList) {
  43. this.nameList = nameList;
  44. mSpinerPopWindow = new MySpinerPopWindow(context);
  45. mSpinerPopWindow.refreshData(nameList, 0);
  46. mSpinerPopWindow.setItemListener(this); // 设置下拉列表item点击的监听,响应onItemClick回调函数
  47. }
  48. /**
  49. * 头部点击事件
  50. * @param v
  51. */
  52. @Override
  53. public void onClick(View v) {
  54. switch (v.getId()){
  55. case R.id.spiner:
  56. showSpinWindow();
  57. break;
  58. }
  59. }
  60. /**
  61. * 弹出下拉列表
  62. */
  63. public void showSpinWindow() {
  64. /**这里还有一步要做,就是让右边箭头向上。自己替换掉ivSpiner图片**/
  65. mSpinerPopWindow.setWidth(((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getWidth());
  66. mSpinerPopWindow.showAsDropDown(tvSpiner);
  67. }
  68. /**
  69. * 下拉列表项点击事件,把选中的值显示在界面上
  70. * @param pos
  71. */
  72. @Override
  73. public void onItemClick(int pos) {
  74. /**这里还有一步要做,就是让右边箭头还原向下。自己替换掉ivSpiner图片**/
  75. if (pos >= 0 && pos <= nameList.size()) { // pos为-1就是弹窗消失,不管他
  76. String value = nameList.get(pos);
  77. tvSpiner.setText(value);
  78. }
  79. }
  80. /**
  81. * 初始化顶部显示数据
  82. * @param txt
  83. */
  84. public void initText(String txt){
  85. tvSpiner.setText(txt);
  86. }
  87. }
自定义控件创建完毕,点击后弹出的下拉列表。

下拉列表实际上是一个PopWindow,里面有一个ListView,所以我们新建一个自定义弹窗PopWindow。代码如下:
  1. package com.newland.myspinerdemo;
  2. import java.util.List;
  3. import android.content.Context;
  4. import android.graphics.drawable.ColorDrawable;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup.LayoutParams;
  8. import android.widget.AdapterView;
  9. import android.widget.AdapterView.OnItemClickListener;
  10. import android.widget.ListView;
  11. import android.widget.PopupWindow;
  12. /**
  13. * 下拉列表弹窗
  14. */
  15. public class MySpinerPopWindow extends PopupWindow implements OnItemClickListener {
  16. private Context mContext;
  17. private ListView mListView;
  18. private MySpinerAdapter mAdapter;
  19. private MySpinerAdapter.IOnItemSelectListener mItemSelectListener;
  20. public MySpinerPopWindow(Context context) {
  21. super(context);
  22. mContext = context;
  23. init();
  24. }
  25. /**
  26. * 为MySpinnerView提供一个item点击事件的监听器,MySpinnerView实例调用此方法设置监听
  27. * @param listener
  28. */
  29. public void setItemListener(MySpinerAdapter.IOnItemSelectListener listener) {
  30. mItemSelectListener = listener;
  31. }
  32. /**
  33. * 初始化弹窗布局
  34. */
  35. private void init() {
  36. View view = LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout, null);
  37. setContentView(view);
  38. setWidth(LayoutParams.WRAP_CONTENT);
  39. setHeight(LayoutParams.WRAP_CONTENT);
  40. setFocusable(true);
  41. ColorDrawable dw = new ColorDrawable(0x00);
  42. setBackgroundDrawable(dw);
  43. mListView = (ListView) view.findViewById(R.id.listview);
  44. mAdapter = new MySpinerAdapter(mContext);
  45. mListView.setAdapter(mAdapter);
  46. mListView.setOnItemClickListener(this);
  47. this.setOnDismissListener(new OnDismissListener() { // 弹窗消失的监听
  48. @Override
  49. public void onDismiss() {
  50. if (mItemSelectListener != null) {
  51. mItemSelectListener.onItemClick(-1); // 弹窗消失,要让布局那边的箭头还原向下,所以那边还得判断一下,>=0的数据在显示,-1就忽略掉,箭头还原
  52. }
  53. }
  54. });
  55. }
  56. /**
  57. * 刷新下拉列表的数据
  58. * @param list
  59. * @param selIndex
  60. */
  61. public void refreshData(List
  62. list, int selIndex) {
  63. if (list != null && selIndex != -1) {
  64. mAdapter.refreshData(list, selIndex);
  65. }
  66. }
  67. /**
  68. * 下拉列表ListView的点击事件。
  69. * @param arg0
  70. * @param view
  71. * @param pos
  72. * @param arg3
  73. */
  74. @Override
  75. public void onItemClick(AdapterView
  76. arg0, View view, int pos, long arg3) {
  77. dismiss();
  78. if (mItemSelectListener != null) {
  79. mItemSelectListener.onItemClick(pos); //点击后调用此方法,则MySpinerView会监听到(因为mItemSelectListener是MySpinerView那边设置的监听器)
  80. }
  81. }
  82. }
既然是ListView,那么马上想到的就是适配器,那么我们接下来设置弹窗里面的ListView适配器,代码如下:
  1. package com.newland.myspinerdemo;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.content.Context;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.BaseAdapter;
  9. import android.widget.TextView;
  10. public class MySpinerAdapter
  11. extends BaseAdapter {
  12. private Context mContext;
  13. private List
  14. mObjects = new ArrayList
  15. ();
  16. private LayoutInflater mInflater;
  17. public MySpinerAdapter(Context context) {
  18. mContext = context;
  19. mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  20. }
  21. /**
  22. * 刷新数据
  23. * @param objects
  24. * @param selIndex
  25. */
  26. public void refreshData(List
  27. objects, int selIndex) {
  28. mObjects = objects;
  29. if (selIndex < 0) {
  30. selIndex = 0;
  31. }
  32. if (selIndex >= mObjects.size()) {
  33. selIndex = mObjects.size() - 1;
  34. }
  35. }
  36. @Override
  37. public int getCount() {
  38. return mObjects.size();
  39. }
  40. @Override
  41. public Object getItem(int pos) {
  42. return mObjects.get(pos).toString();
  43. }
  44. @Override
  45. public long getItemId(int pos) {
  46. return pos;
  47. }
  48. @Override
  49. public View getView(int pos, View convertView, ViewGroup arg2) {
  50. ViewHolder viewHolder;
  51. if (convertView == null) {
  52. convertView = mInflater.inflate(R.layout.spiner_item_layout, null);
  53. viewHolder = new ViewHolder();
  54. viewHolder.mTextView = (TextView) convertView.findViewById(R.id.textView);
  55. convertView.setTag(viewHolder);
  56. } else {
  57. viewHolder = (ViewHolder) convertView.getTag();
  58. }
  59. String item = (String) getItem(pos);
  60. viewHolder.mTextView.setText(item);
  61. return convertView;
  62. }
  63. public static class ViewHolder {
  64. public TextView mTextView;
  65. }
  66. /**
  67. * 提供一个设置点击事件监听的接口回调
  68. */
  69. public interface IOnItemSelectListener {
  70. void onItemClick(int pos);
  71. }
  72. }
好了,功能性的东西都完成了,来看看主页面布局

主页面布局由4个自定义控件(MySpinerView)组成,代码如下:
最后一步,编写Activity,代码如下
  1. package com.newland.myspinerdemo;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. public class MainActivity extends Activity{
  7. /**
  8. * 四个下拉列表头部数据
  9. */
  10. private String name1 = "课程类型";
  11. private String name2 = "教练";
  12. private String name3 = "卡路里";
  13. private String name4 = "时间";
  14. /**
  15. * 四个下拉列表数据
  16. */
  17. private List
  18. nameList1 = new ArrayList
  19. ();
  20. private List
  21. nameList2 = new ArrayList
  22. ();
  23. private List
  24. nameList3 = new ArrayList
  25. (); private List
  26. nameList4 = new ArrayList
  27. (); /** * 四个自定义下拉列表 */ private MySpinerView mySpinerView1; private MySpinerView mySpinerView2; private MySpinerView mySpinerView3; private MySpinerView mySpinerView4; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setupViews(); } /** * 初始化四个下拉列表 */ private void setupViews() { mySpinerView1 = (MySpinerView)findViewById(R.id.mysv1); mySpinerView1.initText(name1); String[] names1 = { "高级课程", "中级课程", "所有课程" }; for (int i = 0; i < names1.length; i++) { nameList1.add(names1[i]); } mySpinerView1.setData(nameList1); mySpinerView2 = (MySpinerView)findViewById(R.id.mysv2); mySpinerView2.initText(name2); String[] names2 = {"小鱼","布拉特", "杰克逊", "菲尔顿", "希伯特"}; for (int i = 0; i < names2.length; i++) { nameList2.add(names2[i]); } mySpinerView2.setData(nameList2); mySpinerView3 = (MySpinerView)findViewById(R.id.mysv3); mySpinerView3.initText(name3); String[] names3 = {"10.0","20.0", "30.0", "40.0", "50.0"}; for (int i = 0; i < names3.length; i++) { nameList3.add(names3[i]); } mySpinerView3.setData(nameList3); mySpinerView4 = (MySpinerView)findViewById(R.id.mysv4); mySpinerView4.initText(name4); String[] names4 = {"1min","1hour", "1day", "1year", "forever"}; for (int i = 0; i < names4.length; i++) { nameList4.add(names4[i]); } mySpinerView4.setData(nameList4); } }

大功告成~~~


附上源码下载链接: Android 自定义下拉列表 源码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/111525
推荐阅读
相关标签
  

闽ICP备14008679号