标签:
自定义变量如下:
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