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

请支持原创: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  != -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

转载于:https://www.cnblogs.com/zhujiabin/p/6233518.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值