Anroid中基于TextView+PopWindow自定义下拉框样式,实现多级下拉框级联

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

}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值