请支持原创:http://blog.csdn.NET/geniuseoe2012/article/details/8723702

说到Android下拉框spineer,框架中虽有现成的控件,但实际效果可能并不是我们所需要的那种,如下图:

其实我们更需要的是像WEB那种风格,如图所示:

其实实现也很简单,就是自定义个popwindow就可以了

下面贴上代码片段:

public class SpinerPopWindow extends PopupWindow implements OnItemClickListener{

    private Context mContext;
private ListView mListView;
private NormalSpinerAdapter mAdapter;
private IOnItemSelectListener mItemSelectListener; public SpinerPopWindow(Context context)
{
super(context); mContext = context;
init();
} public void setItemListener(IOnItemSelectListener listener){
mItemSelectListener = listener;
} private void init()
{
View view = LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout, null);
setContentView(view);
setWidth(LayoutParams.WRAP_CONTENT);
setHeight(LayoutParams.WRAP_CONTENT); setFocusable(true);
ColorDrawable dw = new ColorDrawable(0x00);
setBackgroundDrawable(dw); mListView = (ListView) view.findViewById(R.id.listview); mAdapter = new NormalSpinerAdapter(mContext);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
} public void refreshData(List<String> list, int selIndex)
{
if (list != null && selIndex != -)
{
mAdapter.refreshData(list, selIndex);
}
} @Override
public void onItemClick(AdapterView<?> arg0, View view, int pos, long arg3) {
dismiss();
if (mItemSelectListener != null){
mItemSelectListener.onItemClick(pos);
}
} }

主界面调用代码:

public class SpinerWindowDemoActivity extends Activity implements OnClickListener, AbstractSpinerAdapter.IOnItemSelectListener{
/** Called when the activity is first created. */ private View mRootView;
private TextView mTView;
private ImageButton mBtnDropDown;
private List<String> nameList = new ArrayList<String>(); @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); setupViews();
} private void setupViews(){
mRootView = findViewById(R.id.rootView); mTView = (TextView) findViewById(R.id.tv_value);
mBtnDropDown = (ImageButton) findViewById(R.id.bt_dropdown);
mBtnDropDown.setOnClickListener(this); String[] names = getResources().getStringArray(R.array.hero_name);
for(int i = ; i < names.length; i++){
nameList.add(names[i]);
} mSpinerPopWindow = new SpinerPopWindow(this);
mSpinerPopWindow.refreshData(nameList, );
mSpinerPopWindow.setItemListener(this);
} @Override
public void onClick(View view) {
switch(view.getId()){
case R.id.bt_dropdown:
showSpinWindow();
break;
}
} private void setHero(int pos){
if (pos >= && pos <= nameList.size()){
String value = nameList.get(pos); mTView.setText(value);
}
} private SpinerPopWindow mSpinerPopWindow;
private void showSpinWindow(){
Log.e("", "showSpinWindow");
mSpinerPopWindow.setWidth(mTView.getWidth());
mSpinerPopWindow.showAsDropDown(mTView);
} @Override
public void onItemClick(int pos) {
setHero(pos);
} }

就这么简单,具体UI美化大家再修改下xml就可以了

下面附上工程链接:

http://download.csdn.net/detail/geniuseoe2012/5184664

welcome to join android-develop group:298044305

more brilliant,Please pay attention to my CSDN blog -->http://blog.csdn.net/geniuseoe2012

上一课:Lance老师UI系列教程第六课->微信聊天气泡界面的实现

/*=============================================================================*/

为使SpinerPopWindow更为通用,特修改或增加以下几个类

AbstractSpinerAdapter

 public abstract class AbstractSpinerAdapter<T> extends BaseAdapter {

    public static interface IOnItemSelectListener{
public void onItemClick(int pos);
}; private Context mContext;
private List<T> mObjects = new ArrayList<T>();
private int mSelectItem = ; private LayoutInflater mInflater; public AbstractSpinerAdapter(Context context){
init(context);
} public void refreshData(List<T> objects, int selIndex){
mObjects = objects;
if (selIndex < ){
selIndex = ;
}
if (selIndex >= mObjects.size()){
selIndex = mObjects.size() - ;
} mSelectItem = selIndex;
} private void init(Context context) {
mContext = context;
mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} @Override
public int getCount() { return mObjects.size();
} @Override
public Object getItem(int pos) {
return mObjects.get(pos).toString();
} @Override
public long getItemId(int pos) {
return pos;
} @Override
public View getView(int pos, View convertView, ViewGroup arg2) {
ViewHolder viewHolder; if (convertView == null) {
convertView = mInflater.inflate(R.layout.spiner_item_layout, null);
viewHolder = new ViewHolder();
viewHolder.mTextView = (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
} Object item = getItem(pos);
viewHolder.mTextView.setText(item.toString()); return convertView;
} public static class ViewHolder
{
public TextView mTextView;
} }

SpinerPopWindow

public class SpinerPopWindow extends PopupWindow implements OnItemClickListener{

    private Context mContext;
private ListView mListView;
private AbstractSpinerAdapter mAdapter;
private IOnItemSelectListener mItemSelectListener; public SpinerPopWindow(Context context)
{
super(context); mContext = context;
init();
} public void setItemListener(IOnItemSelectListener listener){
mItemSelectListener = listener;
} public void setAdatper(AbstractSpinerAdapter adapter){
mAdapter = adapter;
mListView.setAdapter(mAdapter);
} private void init()
{
View view = LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout, null);
setContentView(view);
setWidth(LayoutParams.WRAP_CONTENT);
setHeight(LayoutParams.WRAP_CONTENT); setFocusable(true);
ColorDrawable dw = new ColorDrawable(0x00);
setBackgroundDrawable(dw); mListView = (ListView) view.findViewById(R.id.listview);
mListView.setOnItemClickListener(this);
} public <T> void refreshData(List<T> list, int selIndex)
{
if (list != null && selIndex != -)
{
if (mAdapter != null){
mAdapter.refreshData(list, selIndex);
}
}
} @Override
public void onItemClick(AdapterView<?> arg0, View view, int pos, long arg3) {
dismiss();
if (mItemSelectListener != null){
mItemSelectListener.onItemClick(pos);
}
} }

CustemObject

public class CustemObject {

    public String data = "";

    @Override
public String toString() {
// TODO Auto-generated method stub
return data;
} }

CustemSpinerAdapter

public class CustemSpinerAdapter extends AbstractSpinerAdapter<CustemObject>{

    public CustemSpinerAdapter(Context context) {
super(context);
} }

SpinerWindowDemoActivity

public class SpinerWindowDemoActivity extends Activity implements OnClickListener, AbstractSpinerAdapter.IOnItemSelectListener{
/** Called when the activity is first created. */ private View mRootView;
private TextView mTView;
private ImageButton mBtnDropDown;
private List<CustemObject> nameList = new ArrayList<CustemObject>();
private AbstractSpinerAdapter mAdapter; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); setupViews();
} private void setupViews(){
mRootView = findViewById(R.id.rootView); mTView = (TextView) findViewById(R.id.tv_value);
mBtnDropDown = (ImageButton) findViewById(R.id.bt_dropdown);
mBtnDropDown.setOnClickListener(this); String[] names = getResources().getStringArray(R.array.hero_name);
for(int i = ; i < names.length; i++){
CustemObject object = new CustemObject();
object.data = names[i];
nameList.add(object);
} mAdapter = new CustemSpinerAdapter(this);
mAdapter.refreshData(nameList, ); mSpinerPopWindow = new SpinerPopWindow(this);
mSpinerPopWindow.setAdatper(mAdapter);
mSpinerPopWindow.setItemListener(this);
} @Override
public void onClick(View view) {
switch(view.getId()){
case R.id.bt_dropdown:
showSpinWindow();
break;
}
} private void setHero(int pos){
if (pos >= && pos <= nameList.size()){
CustemObject value = nameList.get(pos); mTView.setText(value.toString());
}
} private SpinerPopWindow mSpinerPopWindow;
private void showSpinWindow(){
Log.e("", "showSpinWindow");
mSpinerPopWindow.setWidth(mTView.getWidth());
mSpinerPopWindow.showAsDropDown(mTView);
} @Override
public void onItemClick(int pos) {
setHero(pos);
} }

自定义一个类重写toString方法(CustemObject),自定义一个继承自AbstractSpinerAdapter的类确定对象类型(CustemSpinerAdapter)

构造具体的AbstractSpinerAdapter类对象(CustemSpinerAdapter)

通过refreshData填充数据,然后调用SpinerPopWindow的setAdatper设置数据源,OK大功告成!

新工程链接如下:http://download.csdn.net/detail/geniuseoe2012/5412647

OK,本节课到此为止!欲知更多Android-UI技巧,请关注窝的下一堂课~

更多精彩尽在http://blog.csdn.net/geniuseoe2012

welcome to join android develop group:298044305

Android 自定义spinner下拉框实现的实现的更多相关文章

  1. Android自定义spinner下拉框实现的实现

    一:前言 本人参考博客:http://blog.csdn.net/jdsjlzx/article/details/41316417 最近在弄一个下拉框,发现Android自带的很难实现我的功能,于是去 ...

  2. Android 自定义spinner下拉框实现

    一:前言本人参考博客:http://blog.csdn.net/jdsjlzx/article/details/41316417 最近在弄一个下拉框,发现Android自带的很难实现我的功能,于是去网 ...

  3. android 开发-spinner下拉框控件的实现

    Android提供实现下拉框功能的非常实用的控件Spinner. spinner控件需要向xml资源文件中添加spinner标签,如下: <Spinner android:id="@+ ...

  4. Android UI自定义Spinner下拉框(用popuwindow实现)-转

    定义出第一个图片的布局和弹出框(一个listView)的布局,,这里就不在多说了~ListView需要自己定义一个MyspinnerAdapter~做好这些准备之后,就是弹出框的实现了~  prote ...

  5. 030 Android 第三方开源下拉框:NiceSpinner的使用+自定义Button样式+shape绘制控件背景图+图片选择器(selector)

    1.NiceSpinner下拉框控件介绍 Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框 ...

  6. 一分钟掌握Android spinner下拉框

    Android 自带的spinner下拉框控件是一个不错的系统控件.主要有两种实现方式: 1.静态的spinner 在res\values中加入一个city资源数组文件 2 <resources ...

  7. Android 第三方开源下拉框:NiceSpinner

    Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框Spinner所提供的设计样式,而改用自定 ...

  8. Android第三方开源下拉框:NiceSpinner

     Android第三方开源下拉框:NiceSpinner Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Andro ...

  9. 自定义SWT控件一之自定义单选下拉框

    一.自定义下拉控件 自定义的下拉框,是自定义样式的,其中的下拉框使用的是独立的window,非复选框的下拉框双击单机其它区域或选择完之后,独立window构成的下拉框会自动消失. package co ...

随机推荐

  1. rem 产生的小数像素问题

    由于日常需求以无线居多,所以可以在业务中做一些尝试,如 rem,刚接触这个特性的时候,曾经一度爱不释手,仿佛在无线开发的坎坷路上寻找到一条捷径.然而随着使用范围的扩大,慢慢的发现了一些使用 rem 带 ...

  2. 记忆用户设置-提升程序的体验VB/C#

    有时候,设计的程序有很多的控件,甚至多达近百个,尤其是一些工控软件等,程序运行所需的各种参数都是由用户通过这些控件设置而来,那么记录用户的设置就显得十分必要.如果程序出现异常,起码重新打开可以不用再一 ...

  3. iOS 开发小结

    一,经历 1> 在编写以前有过的类似的新功能时,如果以前的开发人员没有写明明确的注释和开发需求,一定要仔细阅读所有代码,每一句代码都有它存在的意义. 2> 例如,只以为是[self.ful ...

  4. IOS 蓝牙相关-连接外设的代码实现(2)

    我们具体说明一下中心模式的应用场景.主设备(手机去扫描连接外设,发现外设服务和属性,操作服务和属性的应用.一般来说,外设(蓝牙设备,比如智能手环之类的东西), 会由硬件工程师开发好,并定义好设备提供的 ...

  5. C#中Post和Get提交

    1.Post提交 private string PostWebRequest(string Url, string paramData, string dataEncode) { string ret ...

  6. Google Analytics统计代码GA.JS中文教程

    2010-12-06 11:07:08|  分类: java编程 |  标签:google  analytics  ga  js  代码  |举报|字号 订阅     Google Analytics ...

  7. bootstrap学习笔记之四(javascript插件)

    下面展现四个插件的用法,一般插件的功能可以用两种方法实现,一种是引入bootstrap.js后,通过添加data属性实现,另一种则是通过js代码是实现. 第一个插件:下拉菜单的实现 第一种方法:dat ...

  8. js 时间格式化 -- 时间加减实现

    时间格式化的方法: Date.prototype.Format = function (fmt) { //author: meizz var o = { "M+": this.ge ...

  9. 第 2 章 让jsp说hello

    2.1. 另一个简单jsp 上一篇举的例子很单纯,无论谁向服务器发送请求,服务器都只计算当前系统时间,然后把这个时间制作成http响应发还给浏览器. 可惜这种单向的响应没办法实现复杂的业务,比如像这样 ...

  10. WPF中ComboBox绑定数据库自动读取产生数据

    前台端 <ComboBox HorizontalAlignment="Name="cmb_SSBM" DisplayMemberPath="NAME&qu ...