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(); } }); } }