zoukankan      html  css  js  c++  java
  • Lance老师UI系列教程第七课>自定义spinner下拉框实现的实现

    UI系列教程第七课:自定义spinner下拉框实现的实现

    说道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  != -1)
    		{
    			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 = 0; i < names.length; i++){
    			nameList.add(names[i]);
    		}
    		
    
    		mSpinerPopWindow = new SpinerPopWindow(this);
    		mSpinerPopWindow.refreshData(nameList, 0);
    		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 >= 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);
    	}
    
    
    	@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 = 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);
    	 }
    	    
    	    
    	@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  != -1)
    		{
    			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 = 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);
        }
    
    
    	@Override
    	public 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);
    	}
    
    
    	@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

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

     下一课: Lance老师UI系列教程第八课->新浪新闻SlidingMenu界面的实现

  • 相关阅读:
    整体的一个学习线路图
    PyCharm快捷键
    iOS从初级至高级开发工程师面试知识点
    第1章 iOS逆向工程简介
    iOS逆向工程分析与实战-开篇
    《牧羊少年奇幻之旅》读书笔记
    《如何高效学习》读书笔记
    函数式编程-RAC学习笔记
    iOS 能实现一键分享多图到朋友圈吗
    VC/MFC动态画线,画圆,画椭圆,画矩形 .
  • 原文地址:https://www.cnblogs.com/lance2016/p/5204260.html
Copyright © 2011-2022 走看看