码迷,mamicode.com
首页 > 其他好文 > 详细

自定义显示多行 Spinner

时间:2015-03-02 19:27:35      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

自定义变量如下:

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

自定义显示多行 Spinner

标签:

原文地址:http://my.oschina.net/u/1460984/blog/381367

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!