1. 程式人生 > >Android 模仿城市列表ExpandableListView

Android 模仿城市列表ExpandableListView

好久沒寫部落格了。很多東西都沒積累,現在要開始重新積累起來了。嘻嘻

最近在寫一款獲取城市列表,當點選市名稱時,將其下面的區名稱顯示出來,首先我是利用往layout中加入佈局檔案實現的。第三種是從網上看到有人用ExpandableListView實現的。第四種是自己整理的。

第一種方法跟第二種方法十分類似。第二種方法比較精簡一點兒。

public class TwoActivity extends Activity {

	private LinearLayout layout;
	private List<String> provinceList = new ArrayList<String>();// 省份列表
	private List<Map<String, Object>> cityList = new ArrayList<Map<String, Object>>();// 城市列表

	private final String LIST_PROVINCE = "province";// 省份
	private final String LIST_CITY = "city";// 城市
	private final String LIST_IS_OPEN = "isOpen";// 是否展開
	private final String LIST_AREAS = "areas";// 屬於某一個市的區列表

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.two_activity);
		initView();
		getData();
		fillData();
	}

	private void initView() {
		layout = (LinearLayout) findViewById(R.id.layout_two);
	}

	private void getData() {
		for (int i = 0; i < 10; i++) {
			provinceList.add("province" + i);
		}

		for (int j = 0; j < 10; j++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put(LIST_PROVINCE, provinceList.get(j));
			map.put(LIST_CITY, "city" + j);
			map.put(LIST_IS_OPEN, false);
			List<String> itemList = new ArrayList<String>();
			for (int m = 0; m < 10; m++) {
				itemList.add("area is " + m);
			}
			map.put(LIST_AREAS, itemList);
			cityList.add(map);
		}

		for (int j = 0; j < 10; j++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put(LIST_PROVINCE, provinceList.get(j));
			map.put(LIST_CITY, "cityone" + j);
			map.put(LIST_IS_OPEN, false);
			List<String> itemList = new ArrayList<String>();
			for (int m = 0; m < 10; m++) {
				itemList.add("area is " + m);
			}
			map.put(LIST_AREAS, itemList);
			cityList.add(map);

		}

	}

	@SuppressWarnings("unchecked")
	@SuppressLint("InflateParams")
	private void fillData() {
		for (int i = 0; i < provinceList.size(); i++) {
			View v_title = LayoutInflater.from(this).inflate(
					R.layout.item_province, null);
			TextView tv_title = (TextView) v_title
					.findViewById(R.id.tv_title_item);
			tv_title.setText(provinceList.get(i));
			layout.addView(v_title);
			for (int j = 0; j < cityList.size(); j++) {
				if (provinceList.get(i).equals(
						cityList.get(j).get(LIST_PROVINCE))) {
					View v_city = LayoutInflater.from(this).inflate(
							R.layout.item_city, null);
					TextView tv_city = (TextView) v_city
							.findViewById(R.id.tv_city_item);
					tv_city.setText(cityList.get(j).get(LIST_CITY).toString());

					final int position = j;
					tv_city.setOnClickListener(new OnClickListener() {

						@Override
						public void onClick(View v) {
							boolean isOpen = !(boolean) cityList.get(position)
									.get(LIST_IS_OPEN);
							Map<String, Object> newMap = new HashMap<String, Object>();
							newMap = cityList.get(position);
							newMap.put(LIST_IS_OPEN, isOpen);
							layout.removeAllViews();
							fillData();
						}
					});
					layout.addView(v_city);

					if ((boolean) cityList.get(j).get(LIST_IS_OPEN)) {
						List<String> list = new ArrayList<String>();
						list = (List<String>) cityList.get(j).get(LIST_AREAS);
						for (int n = 0; n < list.size(); n++) {
							View v_area = LayoutInflater.from(TwoActivity.this)
									.inflate(R.layout.item_area, null);
							TextView tv_area = (TextView) v_area
									.findViewById(R.id.tv_area_item);
							tv_area.setText(list.get(n));
							layout.addView(v_area);
						}
					}
				}
			}
		}
	}

}
第四種方法是使用ExpandableListView來實現的。比第二種方法簡單很多。並且可以實現相同的功能。
public class FourActivity extends Activity {

	private ExpandableListView expandableListview;
	private FourAdapter adapter;

	private List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();// 儲存資料的列表

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.four_activity);
		initView();
		getListData();
		adapter.setList(dataList);
	}

	private void initView() {
		expandableListview = (ExpandableListView) findViewById(R.id.elv_four);
		expandableListview.setGroupIndicator(null);// 設定屬性,去掉預設的箭頭
		adapter = new FourAdapter(FourActivity.this);
		expandableListview.setAdapter(adapter);
	}

	private void getListData() {
		for (int i = 0; i < 10; i++) {
			Map<String, Object> pMap = new HashMap<String, Object>();
			pMap.put(Constances.LIST_TYPE, Constances.TYPE_PROVINCE);
			pMap.put(Constances.LIST_NAME, "province --- " + i);
			dataList.add(pMap);
			for (int j = 0; j < 3; j++) {
				Map<String, Object> map = new HashMap<String, Object>();
				map.put(Constances.LIST_TYPE, Constances.TYPE_CITY);
				map.put(Constances.LIST_NAME, "province --- " + i + "city === "
						+ j);
				List<String> itemList = new ArrayList<String>();
				for (int m = 0; m < 10; m++) {
					itemList.add("province --- " + i + "city === " + j
							+ "area is " + m);
				}
				map.put(Constances.LIST_AREAS, itemList);
				dataList.add(map);
			}
		}
	}
}
實現的功能十分簡單。就是一個城市列表。點選檢視更多。

原始碼下載地址:http://download.csdn.net/detail/u011382076/8752309

直接下載就可以執行的一個工程。歡迎大家指教