1. 程式人生 > >PopupView實現兩級下拉列表

PopupView實現兩級下拉列表

主要實現思想是定義兩個textView作為下拉列表的點選入口,將PopupView作為下拉的列表,在點選的時候開啟PopupView。

首先在佈局檔案中定義兩個TextView,如下所示:

<LinearLayout
	android:id="@+id/start_lay"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:layout_marginTop="10dp"
	android:orientation="horizontal" >

	<TextView
		android:id="@+id/start_line"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:background="@drawable/new_bg_metro_item"
		android:drawablePadding="10dp"
		android:drawableRight="@drawable/ic_cellclose"
		android:padding="10dp"
		android:text="1號線"
		android:textColor="@color/metro_black_text_color"
		android:textSize="18sp" />

	<TextView
		android:id="@+id/start_station"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:layout_marginLeft="10dp"
		android:background="@drawable/new_bg_metro_item"
		android:drawablePadding="10dp"
		android:drawableRight="@drawable/ic_cellclose"
		android:padding="10dp"
		android:text="請選擇站點"
		android:textColor="@color/metro_black_text_color"
		android:textSize="18sp" />
</LinearLayout>

然後在程式碼中初始化TextView及PopupView:

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.popup_test);
		startLine = (TextView) findViewById(R.id.start_line);
		startStation = (TextView) findViewById(R.id.start_station);
		startLine.setOnClickListener(this);
		startStation.setOnClickListener(this);
		
		lineList=new ArrayList<String>();
				linelist.add("1號線");
				linelist.add("2號線");
		stationListArray=new SparseArray<List<String>>();
		for(int i=0;i<lineList.size();i++){
		    List<String> stationList=new ArrayList<String>();
			stationList.add("木瀆站"+i);
			stationList.add("東環路"+i);
			stationList.add("臨頓路"+i);
			stationList.add("時代廣場站"+i);
			stationList.add("火車站"+i);
			stationListArray.put(i, stationList);
		}
    }
@Override
	public void onClick(View v) {
		switch (v.getId()) {
			case R.id.start_line:{
				popupDataType=TYPE_LINE;//標記選擇的是第一個還是第二個下拉列表			
				initPopupData(startLine);
				break;
			}
			case R.id.start_station:{
				popupDataType=TYPE_STATION;
				initPopupData(startStation);
				break;
			}
		}
	}
	//顯示下拉列表
    private void initPopupData(final View targetView){
		int width=targetView.getWidth();
		View view=LayoutInflater.from(this).inflate(R.layout.layout_popup_listview, null);
		ListView listview=(ListView) view.findViewById(R.id.pop_list);
		if(popupDataType.equals(TYPE_LINE)){
		   if(popupAdapter==null){
				popupAdapter=new PopupAdapter(this, lineList);
				listview.setAdapter(popupAdapter);
			}else{
				popupAdapter.setData(lineList);
				listview.setAdapter(popupAdapter);
			}
		}else{
			if(stationAdapter==null){
				stationAdapter=new StationAdapter(this, currentStationList);
				listview.setAdapter(stationAdapter);
			}else{
				stationAdapter.setData(currentStationList);
				listview.setAdapter(stationAdapter);
			}
		}		
		//重新計算列表的寬度
		LayoutParams params=listview.getLayoutParams();
		params.width=width;
		listview.setLayoutParams(params);
		
		spinnerPopupWindow=new PopupWindow(view,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,true);
		//設定該背景,使點選其他地方時PopupView可消失
		spinnerPopupWindow.setBackgroundDrawable(new ColorDrawable(00000000));
		spinnerPopupWindow.showAsDropDown(targetView);//將列表顯示在TextView的下方
		listview.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				if(popupDataType.equals(TYPE_LINE)){
				//若當前點選的第一級下拉列表的item項,則重新給第二級下拉列表賦值				
					currentStationList=stationListArray.get(i));//獲取當前線路下的站點資訊
					((TextView)targetView).setText(parent.getAdapter().getItem(position).toString());
				}else{
				    if(currentStationList!=null){
					    ((TextView)targetView).setText(currentStationList.get(position).getStationName());
						((TextView)targetView).setTag(currentStationList.get(position));
					}
				}
				spinnerPopupWindow.dismiss();
			}
		});
	}