importandroid.content.Context;
importandroid.util.AttributeSet;
importandroid.util.DisplayMetrics;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.AbsListView;
importandroid.widget.AdapterView;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.ListView;
importandroid.widget.PopupWindow;
importandroid.widget.RelativeLayout;
importandroid.widget.TextView;
importjava.util.ArrayList;
/*** Created by seven on 2016/4/28.*/public classNiceSpinnerextendsRelativeLayoutimplementsView.OnClickListener {
private static final intDEFAULT_MORE_COUNT= 5;
privateContext mContext;
//PopupWindow对象声明privatePopupWindowmPopupWindow;
privateArrayList mList;
privateViewmPopView;
//当前选中的列表项位置private intclickPsition= 0;
privateTextViewspinnerText;
privateImageViewarrowImg;
privateNiceSpinnerCallBack mCallBack;
privateListViewAdaptermAdapter;
private intmoreCount;//加载更多数据private intmRowNum;//最多显示多少条数据private intmDefaultCount;//最多显示多少条数据publicNiceSpinner(Context context) {
super(context);
mContext= context;
init();
}
publicNiceSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
mContext= context;
init();
}
public voidinit() {
DisplayMetricsdm = mContext.getResources().getDisplayMetrics();
intscreenWidth = dm.widthPixels;
intscreenHeigh = dm.heightPixels;
this.setOnClickListener(this);
spinnerText= newTextView(mContext);
spinnerText.setId(R.id.spinner_text);
RelativeLayout.LayoutParamstextParams = newRelativeLayout.LayoutParams(screenWidth / 6, LayoutParams.WRAP_CONTENT);
textParams.addRule(RelativeLayout.CENTER_IN_PARENT);
arrowImg= newImageView(mContext);
arrowImg.setImageResource(R.drawable.icon_spinner_arrow);
RelativeLayout.LayoutParamsimageParams = newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
imageParams.addRule(RelativeLayout.CENTER_VERTICAL);
imageParams.addRule(RelativeLayout.RIGHT_OF, spinnerText.getId());
this.addView(spinnerText, textParams);
this.addView(arrowImg, imageParams);
//通过布局注入器,注入布局给View对象mPopView= LayoutInflater.from(mContext).inflate(R.layout.layout_nice_spinner, null);
//通过view 和宽·高,构造PopopWindowmPopupWindow= newPopupWindow(mPopView, ViewGroup.LayoutParams.MATCH_PARENT,
screenHeigh / 3, true);
//此处为popwindow 设置背景,同事做到点击外部区域,popwindow消失mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_white));
}
public voidsetText(Stringtext) {
spinnerText.setText(text);
}
public voidsetDataList(ArrayList list) {
this.mList= list;
if(spinnerText.getText().toString() == null||
spinnerText.getText().toString().equals(""))
spinnerText.setText(this.mList.get(0));
}
@Overridepublic voidonClick(Viewv) {
//设置焦点为可点击mPopupWindow.setFocusable(true);//可以试试设为false的结果//将window视图显示在NiceSpinner下面mPopupWindow.showAsDropDown(this);
ListViewlv = (ListView) mPopView.findViewById(R.id.list_nice_spinner);
mAdapter= newListViewAdapter(mContext, mList);
lv.setAdapter(mAdapter);
lv.setOnItemClickListener(newAdapterView.OnItemClickListener() {
@Overridepublic voidonItemClick(AdapterView> parent, Viewview,
intposition, longid) {
if(clickPsition!= position) {
clickPsition= position;
}
mPopupWindow.dismiss();
moreCount= 0;
if(mCallBack!= null) {
mCallBack.setText(mList.get(position));
}
}
});
lv.setOnScrollListener(newAbsListView.OnScrollListener() {
@Overridepublic voidonScrollStateChanged(AbsListView view, intscrollState) {
// 判断滚动到底部if(view.getLastVisiblePosition() == view.getCount() - 1) {
if(mCallBack!= null&& moreCount< mRowNum- mDefaultCount) {
moreCount+= DEFAULT_MORE_COUNT;
mCallBack.loadData(moreCount, NiceSpinner.this);
}
}
}
@Overridepublic voidonScroll(AbsListView view, intfirstVisibleItem, intvisibleItemCount, inttotalItemCount) {
}
});
lv.setSelection(clickPsition);
}
public intgetCurrentPosition() {
returnclickPsition;
}
public voidsetDataCount(introwNum, intdefaultCount) {
mRowNum= rowNum;
mDefaultCount= defaultCount;
}
public voidrefresh(ArrayList list) {
if(mAdapter!= null) {
this.mList= list;
mAdapter.setDataList(list);
mAdapter.notifyDataSetChanged();
}
}
private classListViewAdapterextendsBaseAdapter {
privateLayoutInflater inflater;
privateArrayList list;
publicListViewAdapter(Context context, ArrayList list) {
super();
this.inflater= LayoutInflater.from(context);
this.list= list;
}
public voidsetDataList(ArrayList list) {
this.list= list;
}
@Overridepublic intgetCount() {
returnlist.size();
}
@OverridepublicObjectgetItem(intposition) {
//TODO Auto-generated method stubreturn null;
}
@Overridepublic longgetItemId(intposition) {
//TODO Auto-generated method stubreturn0;
}
@OverridepublicViewgetView(intposition, ViewconvertView, ViewGroup parent) {
if(convertView== null) {
convertView= inflater.inflate(R.layout.item_nice_spinner, null);
}
TextViewtv = (TextView) convertView.findViewById(R.id.spinner_text);
tv.setText(list.get(position));
ImageViewimgView = (ImageView) convertView.findViewById(R.id.spinner_select);
if(clickPsition== position) {
imgView.setVisibility(View.VISIBLE);
} else{
imgView.setVisibility(View.INVISIBLE);
}
returnconvertView;
}
}
/*** listView回调接口*/public interfaceNiceSpinnerCallBack {
voidloadData(intmoreCount,Viewview);
voidsetText(Stringtext);
}
public voidaddCallBack(NiceSpinnerCallBack callBack) {
this.mCallBack= callBack;
}
}