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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM