标签:
自定义变量如下:
private Context mContext; private LayoutInflater mInflater; private PopupWindow mPopupWindow; private ListView mListView; private CustomSpinnerAdapter mAdapter;//下拉适配器 private OnSpinnerItemSelectedListener mListener;//自定义选中回调接口 private List<SpinnerItem> mSpinnerItems;//自定义数据集
下拉适配器主要用于显示下拉文本与选中文本后的“选中图标”,自定义选中下拉 item 回调接口如下:
/** * Item 选中回调接口 *@author liuyinjun * @date 2015-2-8 */ public interface OnSpinnerItemSelectedListener { public void onItemSelected(SpinnerItem item); }
为了方便统一显示,自定义数据类型 SpinnerItem:
/** * *@author liuyinjun * @date 2015-2-8 */ public class SpinnerItem { public int id; public String name;//显示名称 public boolean isChoose;//当前是否已经选择 }
初始化 PopupWindow:
/** * 初始化数据 */ private void initData() { // 初始化 PopupWindow mPopupWindow = new PopupWindow(mContext); // 触摸控件外消失 mPopupWindow.setTouchInterceptor(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { mPopupWindow.dismiss(); return true; } return false; } }); View contentView = mInflater.inflate(R.layout.spinner_shared_list, null); mPopupWindow.setContentView(contentView); mPopupWindow.setWidth(LayoutParams.FILL_PARENT); mPopupWindow.setHeight(LayoutParams.WRAP_CONTENT); mPopupWindow.setTouchable(true); mPopupWindow.setFocusable(true); mPopupWindow.setOutsideTouchable(true); mPopupWindow.setBackgroundDrawable(new BitmapDrawable()); mPopupWindow.setAnimationStyle(R.style.SpinnerAnimation);// 设置进入进出动画 mListView = (ListView) contentView.findViewById(R.id.popwin_shared_listview); mListView.setOnItemClickListener(new OnItemClickListener() {// 下拉后点击 // item 事件 @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (mListener != null) { SpinnerItem item = mSpinnerItems.get(position); setChoose(item.id); mListener.onItemSelected(item); } mPopupWindow.dismiss(); } }); mAdapter = new CustomSpinnerAdapter(mContext, mSpinnerItems); mListView.setAdapter(mAdapter); } /** * 选择 Item,并通知适配器改变显示 * * @param id */ public void setChoose(int id) { Log.i("id=", "" + id); for (SpinnerItem item : mSpinnerItems) { if (item.id == id) { item.isChoose = true; } else { item.isChoose = false; } } mAdapter.notifyDataSetChanged(); }
通过 3 种方法增加数据集:
/** * 方法1:根据List集合增加数据集 * * @param object * ,object必须实现toString方法 */ public <T> void add(List<T> object) { if (object == null) return; final int length = object.size(); for (int i = 0; i < length; i++) { add(i, object.get(i).toString()); } } /** * 方法2:根据参数增加数据集 * * @param names */ public void add(String... names) { if (names == null) return; final int length = names.length; for (int i = 0; i < length; i++) { add(i, names[i]); } } /** * 方法3:根据资源ID增加数据集 * * @param id * @param nameRes */ public void add(int id, int nameRes) { add(id, mContext.getString(nameRes)); } /** * 转换成自定义的数据类型SpinnerItem,把数据集增加到 mSpinnerItems * * @param id * @param name */ public void add(int id, String name) { SpinnerItem item = new SpinnerItem(); item.id = id; item.name = name; mSpinnerItems.add(item); }
下拉显示:
/** * 下拉显示 * * @param anchor */ public void show(View anchor) { mPopupWindow.showAsDropDown(anchor, 0, 0); }
至此,关键代码已贴出,关键是 PopupWindow 的运用,关于如何使用请看自定义显示多行 Spinner
标签:
原文地址:http://my.oschina.net/u/1460984/blog/381367