Spinner的实现

1.dropdowm mode:

使用的是ListPopupWindow:

设置ListPopupWindow的ListView的OnItemClickListener:

public DropdownPopup(
                Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);

            setAnchorView(Spinner.this);
            setModal(true);
            setPromptPosition(POSITION_PROMPT_ABOVE);
            setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView parent, View v, int position, long id) {//调用该方法后,requestLayout(),重新布局将调用Spinner的layout()方法,方法中将根据position,把selected item的view从ListView中取出,addView到Spinner中。因为执行layout时,该List View已经从PupupWindow中解绑,窗口也移除了。Spinner算是废物利用,但是不明白的是,为什么PopupWindow用一次ListView就不用了。
                    Spinner.this.setSelection(position);
                    if (mOnItemClickListener != null) {
                        Spinner.this.performItemClick(v, position, mAdapter.getItemId(position));//调用Spinner.setOnItemClickListener设置的
                    }
                    dismiss();//wm.removeView()
                }
            });
        }

2.dialogMode:

使用的是AlertDialog的singleIchoice样式的ListView。

        public void show(int textDirection, int textAlignment) {
            if (mListAdapter == null) {
                return;
            }
            AlertDialog.Builder builder = new AlertDialog.Builder(getPopupContext());
            if (mPrompt != null) {
                builder.setTitle(mPrompt);
            }
            mPopup = builder.setSingleChoiceItems(mListAdapter,
                    getSelectedItemPosition(), this).create();
            final ListView listView = mPopup.getListView();
            listView.setTextDirection(textDirection);
            listView.setTextAlignment(textAlignment);
            mPopup.show();
        }

        public void onClick(DialogInterface dialog, int which) {//该类实现了DialogInterface.OnClickListener
            setSelection(which);
            if (mOnItemClickListener != null) {
                performItemClick(null, which, mListAdapter.getItemId(which));
            }
            dismiss();
        }

猜你喜欢

转载自blog.csdn.net/b1480521874/article/details/88347049