NewSpinner源码
public class NewSpinner extends LinearLayout {
private Context context;
private View spinnerView;
private TextView input;
private PopupWindow popWin;
private ListView listView;
private LayoutInflater layoutInflater;
private Boolean isChosen = false; // 当前下拉框是否选中某个选项,默认为空,即没有
private AdapterView.OnItemClickListener onItemClickListener;
private AdapterView.OnItemSelectedListener onItemSelectedListener;
private TextView.OnClickListener onContentClickListener;
// private OnItemSelectedCallback callback;
public NewSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
spinnerView = layoutInflater.inflate(R.layout.spinnerlayout, null);
addView(spinnerView);
init();
}
private void init() {
// 初始化输入框和下拉弹框
input = (TextView) spinnerView.findViewById(R.id.input);
input.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(onContentClickListener != null) {
onContentClickListener.onClick(v);
}
// 定义 popupWindow
popWin = new PopupWindow(context);
popWin.setWidth(input.getWidth()); // 设置宽度
popWin.setHeight(200); // 设置popWin 高度
popWin.setFocusable(true);
popWin.setContentView(listView); // 为popWindow填充内容
popWin.setOutsideTouchable(true); // 点击popWin 以处的区域,自动关闭 popWin
popWin.showAsDropDown(input, 0, 0);// 设置 弹出窗口,显示的位置
}
});
}
public void setAdapter( final MyListAdapter adapter) {
// 初始化ListView控件
listView = new ListView(context);
listView.setBackgroundResource(R.drawable.listview_background);
// 设置listView 背景
listView.setDivider(null); // 设置条目之间的分隔线为null
listView.setVerticalScrollBarEnabled(true); // 关闭
listView.setFocusable(true);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(parent, view, position, id);
}
if (onItemSelectedListener != null) {
onItemSelectedListener.onItemSelected(parent, view, position, id);
}
input.setText(adapter.getItemInDataset(position));
popWin.dismiss();
isChosen = true;
}
});
}
public void addOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public void setOnItemSelectedListener(AdapterView.OnItemSelectedListener onItemSelectedListener) {
this.onItemSelectedListener = onItemSelectedListener;
}
public void addOnContentClickListener(TextView.OnClickListener onClickListener) {
this.onContentClickListener = onClickListener;
}
/**
* 判断下拉框中是否选中有内容
*
* @return
*/
public boolean isChosen() {
return isChosen;
}
/**
* 当需要保存时,取出当前下拉框中选中的内容
*
* @return
*/
public String getChosenContent() {
return (String) input.getText();
}
/**
* 将TextView的内容设置为空
*/
public void resetShownContent() {
input.setText("");
isChosen = false;
}
}
Adapter源码:
public class MyListAdapter extends BaseAdapter {
private List<String> msgList;
private LayoutInflater layoutInflater;
private Context context;
private View listItemView;
public MyListAdapter(List<String> msgList, Context context){
super();
this.msgList = msgList;
this.context = context;
this.layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return msgList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = layoutInflater.inflate(R.layout.list_item, null);
holder.tv_msg = (TextView) convertView.findViewById(R.id.tv_list_item);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_msg.setText(msgList.get(position));
return convertView;
}
class ViewHolder {
TextView tv_msg;
}
public String getItemInDataset(int position) {
return msgList.get(position).toString();
}
}
具体使用:
public class MainActivity extends Activity {
//省份对应的数据项和下拉框
private NewSpinner spinner1;
private List<String>msgList1;
private MyListAdapter listAdapter1;
private String[] repType;
//市区对应的数据和下拉框
private NewSpinner spinner2;
private List<String>msgList2;
private MyListAdapter listAdapter2;
private String[][] repTech;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
repType = new String[] {"河北","河南","山东","山西","湖南","湖北","广东","广西"};
repTech = new String[][] {
{"石家庄","保定","邢台","邯郸"},
{"郑州","安阳","新乡","焦作"},
{"济南","泰安","菏泽","青岛","枣庄","潍坊"},
{"长治","运城","大同"},
{"湘潭","长沙"},
{"武汉"},
{"广州"},
{"桂林"}
};
msgList1 = new ArrayList<String>(Arrays.asList(repType));
msgList2 = new ArrayList<String>();
spinner1 = (NewSpinner) findViewById(R.id.spinnerlayout1);
spinner2 = (NewSpinner) findViewById(R.id.spinnerlayout2);
listAdapter1 = new MyListAdapter(msgList1, MainActivity.this);
spinner1.setAdapter(listAdapter1);
//实现两级联动
spinner1.addOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long arg3) {
msgList2.clear();
for(int i=0;i<repTech[position].length;i++) {
msgList2.add(repTech[position][i]);
}
//省份信息变化,市区信息相应变化,重置市区下拉框的内容
listAdapter2 = new MyListAdapter(msgList2, MainActivity.this);
spinner2.setAdapter(listAdapter2);
spinner2.resetShownContent();
}
});
//省份数据为空,点击市区数据下拉框时
spinner2.addOnContentClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if(!spinner1.isChosen())
Toast.makeText(getApplicationContext(), "请先选择省份类型!", 0).show();
}
});
}
}