PopupView實現兩級下拉列表
阿新 • • 發佈:2019-01-22
主要實現思想是定義兩個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(); } }); }