Android自定义Spinner
来源:互联网 发布:linux cp命令文件夹 编辑:程序博客网 时间:2024/05/19 06:16
项目中用到Spinner,什么都好,就是内含的popup无法限制高度。当我展示的数据较多时,
spinner会自动计算屏高,尽可能多的展示,导致item列表时高时矮,不甚美观。耗费了很多时间和精力
在网上查找解决方法,并仔细看了Spinner源码,发现真的没有提供限制高度这一方法。无奈只能尝试自己写一个类似功能的
MySpinner。
我们知道Spinner有DropdownPopup,DialogPopup两种展示模式,这里只用到DropDown模式,所以MySpinner中只用到了
TextView,PopupWindow和ListView。思路是点击TextView,显示包含ListView的PopupWindow和ListView,
然后设置 一系列点击事件和监听,满足需求。特点就在于可灵活设置PopupWindow宽高和Spinner常见功能。但因为只用到了基本的ArrayAdapter,所以功能有点受限。
代码如下:
public class MySpinner extends AppCompatTextView { private PopupWindow popupWindow; private int popupWindowWidth = 50; private int popupWindowHeight = 50; private int listviewDividerHeight = 0; private int selectedItemPosition = 0; private ListView listView; private ListAdapter adapter; private MySpinnerListener listener;//可监听listview Item点击,回调结果 public MySpinner(Context context) { super(context); initView(context); initListener(); } public MySpinner(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initView(context); initListener(); } public MySpinner(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); initListener(); } private void initView(Context context) { popupWindow = new PopupWindow(this); listView = new ListView(context); } private void initListener() { setOnItemClickListener(); popupWindowShowAsDropDown(MySpinner.this); } public void setPopupWindowParams(int windowWidth,int windowHeight) { this.popupWindowWidth = windowWidth; this.popupWindowHeight = windowHeight; } public void setPopupWindowWidth(int windowWidth) { this.popupWindowWidth = windowWidth; } public void setPopupWindowHeight(int windowHeight) { this.popupWindowHeight = windowHeight; } public void setListviewDividerHeight(int listviewDividerHeight) { this.listviewDividerHeight = listviewDividerHeight; } public void setAdapter(ListAdapter adapter) { this.adapter = adapter; } //listview 点击事件 private void setOnItemClickListener() { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectedItemPosition = position; String itemselect = (String) parent.getItemAtPosition(position); MySpinner.this.setText(itemselect); popupWindow.dismiss(); //回调 if (listener != null) listener.onItemSelected(itemselect, position); } }); } //作用同 listview setOnItemSelectedListener public void setMySpinnerOnItemSelectedListener(MySpinnerListener listener) { this.listener = listener; } public void popupWindowShowAsDropDown(View anchor) { popupWindowShowAsDropDown(anchor, 0, 0); } public void popupWindowShowAsDropDown(View anchor, int xoff, int yoff) { popupWindowShowAsDropDown(anchor, xoff, yoff, Gravity.TOP | Gravity.START); } public void popupWindowShowAsDropDown(final View anchor, final int xoff, final int yoff, final int gravity) { //popupwindow显示事件 this.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { popupWindow.showAsDropDown(anchor, xoff, yoff, gravity); } }); } public void show() { listView.setBackgroundResource(R.drawable.shape_bg_test); listView.setDividerHeight(listviewDividerHeight); listView.setAdapter(adapter); popupWindow.setWidth(popupWindowWidth); popupWindow.setHeight(popupWindowHeight); popupWindow.setContentView(listView); popupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000)); popupWindow.setOutsideTouchable(false); popupWindow.setFocusable(true); setSelection(0); } public void setSelection(int i) { if (adapter != null && adapter.getCount() > i) { selectedItemPosition = i; listView.setSelection(i); MySpinner.this.setText((String) adapter.getItem(i)); } } public String getSelectedItem() { return (String) listView.getItemAtPosition(selectedItemPosition); } public int getSelectedItemPosition() { return selectedItemPosition; }}
public interface MySpinnerListener { public void onItemSelected(String item,int position);}
调用如下:
myspinner.setPopupWindowParams(dip2px(getActivity(), 70), dip2px(getActivity(), 26*7)); myspinner.setAdapter(new ArrayAdapter<String>(getActivity(), R.layout.simple_spinner_dropdown_item, getDays())); myspinner.show();
阅读全文
0 0
- 自定义Android的Spinner
- 自定义Android的Spinner
- 自定义Android的Spinner
- Android 实现自定义Spinner
- 自定义Android的Spinner
- 自定义Android的Spinner
- 自定义Android的Spinner
- 自定义Android的Spinner
- android自定义Spinner
- Android 实现自定义Spinner
- Android自定义Spinner
- android之自定义Spinner
- Android 实现自定义Spinner
- Android 实现自定义Spinner
- Android 自定义Spinner
- Android 自定义 spinner样式
- Android自定义Spinner
- Android自定义Spinner
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- C语言实验——输出字符串
- mysql sql语句大全
- nrf51822-使用16位自定义UUID
- iframe js自适应高度
- Android自定义Spinner
- Windows环境变量配置笔记
- Sqlite android 中文排序
- php 过滤器filter_var验证邮箱/url/ip等
- dubbo&hsf&spring-cloud简单介绍
- 关于js
- 完整ASP.Net Excel导入程序(支持2007)
- Android中获取View宽高方法
- linux---静态库与动态库的创建、生成、使用