自定义Spinner下拉列表
说道android下拉框spineer,框架中虽有现成的控件,但实际效果可能并不是我们所需要的那种,如下图:
其实我们更需要的是像WEB那种风格,如图所示:
其实实现也很简单,就是自定义个popwindow就可以了
下面贴上代码片段:
[java] view plain copy print ?
- publicclassSpinerPopWindowextendsPopupWindowimplementsOnItemClickListener{
- privateContextmContext;
- privateListViewmListView;
- privateNormalSpinerAdaptermAdapter;
- privateIOnItemSelectListenermItemSelectListener;
- publicSpinerPopWindow(Contextcontext)
- {
- super(context);
- mContext=context;
- init();
- }
- publicvoidsetItemListener(IOnItemSelectListenerlistener){
- mItemSelectListener=listener;
- }
- privatevoidinit()
- {
- Viewview=LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout,null);
- setContentView(view);
- setWidth(LayoutParams.WRAP_CONTENT);
- setHeight(LayoutParams.WRAP_CONTENT);
- setFocusable(true);
- ColorDrawabledw=newColorDrawable(0x00);
- setBackgroundDrawable(dw);
- mListView=(ListView)view.findViewById(R.id.listview);
- mAdapter=newNormalSpinerAdapter(mContext);
- mListView.setAdapter(mAdapter);
- mListView.setOnItemClickListener(this);
- }
- publicvoidrefreshData(List<String>list,intselIndex)
- {
- if(list!=null&&selIndex!=-1)
- {
- mAdapter.refreshData(list,selIndex);
- }
- }
- @Override
- publicvoidonItemClick(AdapterView<?>arg0,Viewview,intpos,longarg3){
- dismiss();
- if(mItemSelectListener!=null){
- mItemSelectListener.onItemClick(pos);
- }
- }
- }
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 != -1){mAdapter.refreshData(list, selIndex);}}@Overridepublic void onItemClick(AdapterView<?> arg0, View view, int pos, long arg3) {dismiss();if (mItemSelectListener != null){mItemSelectListener.onItemClick(pos);}}}主界面调用代码:
[java] view plain copy print ?
- publicclassSpinerWindowDemoActivityextendsActivityimplementsOnClickListener,AbstractSpinerAdapter.IOnItemSelectListener{
- /**Calledwhentheactivityisfirstcreated.*/
- privateViewmRootView;
- privateTextViewmTView;
- privateImageButtonmBtnDropDown;
- privateList<String>nameList=newArrayList<String>();
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setupViews();
- }
- privatevoidsetupViews(){
- 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(inti=0;i<names.length;i++){
- nameList.add(names[i]);
- }
- mSpinerPopWindow=newSpinerPopWindow(this);
- mSpinerPopWindow.refreshData(nameList,0);
- mSpinerPopWindow.setItemListener(this);
- }
- @Override
- publicvoidonClick(Viewview){
- switch(view.getId()){
- caseR.id.bt_dropdown:
- showSpinWindow();
- break;
- }
- }
- privatevoidsetHero(intpos){
- if(pos>=0&&pos<=nameList.size()){
- Stringvalue=nameList.get(pos);
- mTView.setText(value);
- }
- }
- privateSpinerPopWindowmSpinerPopWindow;
- privatevoidshowSpinWindow(){
- Log.e("","showSpinWindow");
- mSpinerPopWindow.setWidth(mTView.getWidth());
- mSpinerPopWindow.showAsDropDown(mTView);
- }
- @Override
- publicvoidonItemClick(intpos){
- setHero(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 = 0; i < names.length; i++){nameList.add(names[i]);}mSpinerPopWindow = new SpinerPopWindow(this);mSpinerPopWindow.refreshData(nameList, 0);mSpinerPopWindow.setItemListener(this); }@Overridepublic void onClick(View view) {switch(view.getId()){case R.id.bt_dropdown:showSpinWindow();break;}}private void setHero(int pos){if (pos >= 0 && 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);}@Overridepublic 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
[java] view plain copy print ?- <SPANstyle="COLOR:#3366ff">publicabstractclassAbstractSpinerAdapter<T>extendsBaseAdapter{
- publicstaticinterfaceIOnItemSelectListener{
- publicvoidonItemClick(intpos);
- };
- privateContextmContext;
- privateList<T>mObjects=newArrayList<T>();
- privateintmSelectItem=0;
- privateLayoutInflatermInflater;
- publicAbstractSpinerAdapter(Contextcontext){
- init(context);
- }
- publicvoidrefreshData(List<T>objects,intselIndex){
- mObjects=objects;
- if(selIndex<0){
- selIndex=0;
- }
- if(selIndex>=mObjects.size()){
- selIndex=mObjects.size()-1;
- }
- mSelectItem=selIndex;
- }
- privatevoidinit(Contextcontext){
- mContext=context;
- mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
- @Override
- publicintgetCount(){
- returnmObjects.size();
- }
- @Override
- publicObjectgetItem(intpos){
- returnmObjects.get(pos).toString();
- }
- @Override
- publiclonggetItemId(intpos){
- returnpos;
- }
- @Override
- publicViewgetView(intpos,ViewconvertView,ViewGrouparg2){
- ViewHolderviewHolder;
- if(convertView==null){
- convertView=mInflater.inflate(R.layout.spiner_item_layout,null);
- viewHolder=newViewHolder();
- viewHolder.mTextView=(TextView)convertView.findViewById(R.id.textView);
- convertView.setTag(viewHolder);
- }else{
- viewHolder=(ViewHolder)convertView.getTag();
- }
- Objectitem=getItem(pos);
- viewHolder.mTextView.setText(item.toString());
- returnconvertView;
- }
- publicstaticclassViewHolder
- {
- publicTextViewmTextView;
- }
- }</SPAN>
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 = 0; private LayoutInflater mInflater; public AbstractSpinerAdapter(Context context){ init(context); } public void refreshData(List<T> objects, int selIndex){ mObjects = objects; if (selIndex < 0){ selIndex = 0; } if (selIndex >= mObjects.size()){ selIndex = mObjects.size() - 1; } mSelectItem = selIndex; } private void init(Context context) { mContext = context; mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Overridepublic int getCount() {return mObjects.size();}@Overridepublic Object getItem(int pos) {return mObjects.get(pos).toString();}@Overridepublic long getItemId(int pos) {return pos;}@Overridepublic 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
[java] view plain copy print ?- publicclassSpinerPopWindowextendsPopupWindowimplementsOnItemClickListener{
- privateContextmContext;
- privateListViewmListView;
- privateAbstractSpinerAdaptermAdapter;
- privateIOnItemSelectListenermItemSelectListener;
- publicSpinerPopWindow(Contextcontext)
- {
- super(context);
- mContext=context;
- init();
- }
- publicvoidsetItemListener(IOnItemSelectListenerlistener){
- mItemSelectListener=listener;
- }
- publicvoidsetAdatper(AbstractSpinerAdapteradapter){
- mAdapter=adapter;
- mListView.setAdapter(mAdapter);
- }
- privatevoidinit()
- {
- Viewview=LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout,null);
- setContentView(view);
- setWidth(LayoutParams.WRAP_CONTENT);
- setHeight(LayoutParams.WRAP_CONTENT);
- setFocusable(true);
- ColorDrawabledw=newColorDrawable(0x00);
- setBackgroundDrawable(dw);
- mListView=(ListView)view.findViewById(R.id.listview);
- mListView.setOnItemClickListener(this);
- }
- public<T>voidrefreshData(List<T>list,intselIndex)
- {
- if(list!=null&&selIndex!=-1)
- {
- if(mAdapter!=null){
- mAdapter.refreshData(list,selIndex);
- }
- }
- }
- @Override
- publicvoidonItemClick(AdapterView<?>arg0,Viewview,intpos,longarg3){
- dismiss();
- if(mItemSelectListener!=null){
- mItemSelectListener.onItemClick(pos);
- }
- }
- }
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 != -1){if (mAdapter != null){mAdapter.refreshData(list, selIndex);}}}@Overridepublic void onItemClick(AdapterView<?> arg0, View view, int pos, long arg3) {dismiss();if (mItemSelectListener != null){mItemSelectListener.onItemClick(pos);}}}
CustemObject
- <SPANstyle="COLOR:#3366ff">publicclassCustemObject{
- publicStringdata="";
- @Override
- publicStringtoString(){
- //TODOAuto-generatedmethodstub
- returndata;
- }
- }</SPAN>
public class CustemObject {public String data = "";@Overridepublic String toString() {// TODO Auto-generated method stubreturn data;}}
CustemSpinerAdapter
[java] view plain copy print ?- publicclassCustemSpinerAdapterextendsAbstractSpinerAdapter<CustemObject>{
- publicCustemSpinerAdapter(Contextcontext){
- super(context);
- }
- }
public class CustemSpinerAdapter extends AbstractSpinerAdapter<CustemObject>{public CustemSpinerAdapter(Context context) {super(context);}}
SpinerWindowDemoActivity
- publicclassSpinerWindowDemoActivityextendsActivityimplementsOnClickListener,AbstractSpinerAdapter.IOnItemSelectListener{
- /**Calledwhentheactivityisfirstcreated.*/
- privateViewmRootView;
- privateTextViewmTView;
- privateImageButtonmBtnDropDown;
- privateList<CustemObject>nameList=newArrayList<CustemObject>();
- privateAbstractSpinerAdaptermAdapter;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setupViews();
- }
- privatevoidsetupViews(){
- 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(inti=0;i<names.length;i++){
- CustemObjectobject=newCustemObject();
- object.data=names[i];
- nameList.add(object);
- }
- mAdapter=newCustemSpinerAdapter(this);
- mAdapter.refreshData(nameList,0);
- mSpinerPopWindow=newSpinerPopWindow(this);
- mSpinerPopWindow.setAdatper(mAdapter);
- mSpinerPopWindow.setItemListener(this);
- }
- @Override
- publicvoidonClick(Viewview){
- switch(view.getId()){
- caseR.id.bt_dropdown:
- showSpinWindow();
- break;
- }
- }
- privatevoidsetHero(intpos){
- if(pos>=0&&pos<=nameList.size()){
- CustemObjectvalue=nameList.get(pos);
- mTView.setText(value.toString());
- }
- }
- privateSpinerPopWindowmSpinerPopWindow;
- privatevoidshowSpinWindow(){
- Log.e("","showSpinWindow");
- mSpinerPopWindow.setWidth(mTView.getWidth());
- mSpinerPopWindow.showAsDropDown(mTView);
- }
- @Override
- publicvoidonItemClick(intpos){
- setHero(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<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 = 0; i < names.length; i++){CustemObject object = new CustemObject();object.data = names[i];nameList.add(object);}mAdapter = new CustemSpinerAdapter(this);mAdapter.refreshData(nameList, 0);mSpinerPopWindow = new SpinerPopWindow(this);mSpinerPopWindow.setAdatper(mAdapter);mSpinerPopWindow.setItemListener(this); }@Overridepublic void onClick(View view) {switch(view.getId()){case R.id.bt_dropdown:showSpinWindow();break;}}private void setHero(int pos){if (pos >= 0 && 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);}@Overridepublic void onItemClick(int pos) {setHero(pos);}}
自定义一个类重写toString方法(CustemObject),自定义一个继承自AbstractSpinerAdapter的类确定对象类型(CustemSpinerAdapter)
构造具体的AbstractSpinerAdapter类对象(CustemSpinerAdapter)
通过refreshData填充数据,然后调用SpinerPopWindow的setAdatper设置数据源,OK大功告成!
新工程链接如下:http://download.csdn.net/detail/geniuseoe2012/5412647
更多相关文章
- Android打电话过程
- Android系统java层次service实现
- 三、数据库入门和listview的基本使用
- Android中OkHttp的使用(详解)
- android 加载自定义图片并在图片上绘图
- Android中怎么启动关闭Service及功能解释 .
- Android(安卓)setBackgroundResource()/setBackgroundDrawable()
- Android(安卓)MediaPlayer的生命周期
- Android四大组件介绍