省市县三级联动(带拼音、首字母、经纬度坐标)

        这几天公司要做一个配置程序,要求配置省市县和拼音缩写及首字母,在网上找了好久,都不全,特写此博客,积累知识。
        一,布局文件.xml
         1,activity_main.xml
 <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >


        <Spinner
            android:id="@+id/sp_prover"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" >
        </Spinner>


        <Spinner
            android:id="@+id/sp_city"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" >
        </Spinner>


        <Spinner
            android:id="@+id/sp_county"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" >
        </Spinner>
    </LinearLayout>
2,tiem.xml
  <TextView
        android:id="@+id/tv_com_item_one"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:textSize="18dp" 
        android:text="beijing"/>

二、MainActivity

@ViewInject(R.id.sp_prover)
private Spinner sp_prover; // 省
@ViewInject(R.id.sp_city)
private Spinner sp_city; // 市
@ViewInject(R.id.sp_county)
private Spinner sp_county;// 县


private CityAdapter adapter;


private CityModel model = new CityModel(MainActivity.this);


private List<ProverAndCity> proversList; // 所有的数据
List<ProverAndCity> provers = new ArrayList<ProverAndCity>(); // 省
List<ProverAndCity> datas = new ArrayList<ProverAndCity>(); // 市
List<ProverAndCity> countys = new ArrayList<ProverAndCity>(); // 县


private String pro;
private String data;
private String county;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
x.view().inject(this);


sp_prover.setOnItemSelectedListener(this);
sp_city.setOnItemSelectedListener(this);
sp_county.setOnItemSelectedListener(this);
model.findAllDate(new AsynCallBack() {


@Override
public void onErrorLoader(String msge) {
// TODO Auto-generated method stub


}


@Override
public void onDataLoader(Object obj) {
proversList = (List<ProverAndCity>) obj;
int star_index = 0;
int stop_index = 0;


int index = 0;
for (int i = 0; i < proversList.size(); i++) {
if (proversList.get(i).getPid() == 0) {


provers.add(proversList.get(i));


}


}


adapter = new CityAdapter(MainActivity.this, provers);


sp_prover.setAdapter(adapter);


}
});


}


// 根据省获取市,根据市获取县
private List<ProverAndCity> getCityDatas(int id, List<ProverAndCity> proversList) {


Log.e("proverInfor", "list =  " + proversList.size() + "  /id = " + id);


List<ProverAndCity> cityDatas = new ArrayList<ProverAndCity>(); // 市


// int pid = proversList.get(id).getPid();


for (int i = 0; i < proversList.size(); i++) {


if (proversList.get(i).getPid() == id) {


Log.w("proverInfor", "list 000 ");
cityDatas.add(proversList.get(i));


}


}


return cityDatas;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}


@Override
public void onItemSelected(AdapterView<?> arg0, View view, int position, long id1) {


switch (arg0.getId()) {
case R.id.sp_prover:


pro = provers.get(position).getName();
Log.d("onitemselected", "      00 pro = " + pro);
int id = provers.get(position).getId();
datas = getCityDatas(id, proversList);
adapter = new CityAdapter(MainActivity.this, datas);
sp_city.setAdapter(adapter);
break;


case R.id.sp_city:


data = datas.get(position).getName();
Log.d("onitemselected", "      11 data =" + data);
int id_data = datas.get(position).getId();


countys = getCityDatas(id_data, proversList);


adapter = new CityAdapter(MainActivity.this, countys);
sp_county.setAdapter(adapter);


break;


case R.id.sp_county:
county = countys.get(position).getName();
Log.d("onitemselected", "      22 county = " + county);


Toast.makeText(MainActivity.this, pro + " / " + data + " / " + county, Toast.LENGTH_LONG).show();


break;
}


}


@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub


}

三、adapter.class
public class CityAdapter extends BaseAdapter {
private Context context;
private List<ProverAndCity> datas;
private LayoutInflater inflater;


public CityAdapter(Context context, List<ProverAndCity> datas) {
super();
this.context = context;
this.datas = datas;
this.inflater = inflater.from(this.context);
}


@Override
public int getCount() {
// TODO Auto-generated method stub
return datas.size();
}


@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}


@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {


final ProverAndCity pac = datas.get(position);
ViewHolder holder;

Log.d("proverInfor", "pac = "+pac.getName());



if (convertView == null) {


holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item, null);
holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_com_item_one);


convertView.setTag(holder);


} else {
holder = (ViewHolder) convertView.getTag();
}


holder.tvTitle.setText(pac.getName() + "");
Log.d("proverInfor", "pac.getName() = "+pac.getName());


return convertView;
}


class ViewHolder {


TextView tvTitle;


}


}

四、实体类
/**
 * 实体类封装类
 * 
 * @author zd
 *
 */
public class ProverAndCity {


private int id;// :1,
private int pid;// ":0,
private String shortname;// ":"北京",
private String name;// ":"北京",
private String merger_name;// ":"中国,北京",
private int level;// ":1,
private String pinyin;// ":"beijing",
private String code;// ":null,
private String zip_code;// ":null,
private String first;// ":"B",
private String lng;// ":"116.405285",
private String lat;// ":"39.904989"


public int getId() {
return id;
}


public int getPid() {
return pid;
}


public String getShortname() {
return shortname;
}


public String getName() {
return name;
}


public String getMerger_name() {
return merger_name;
}


public int getLevel() {
return level;
}


public String getPinyin() {
return pinyin;
}


public String getCode() {
return code;
}


public String getZip_code() {
return zip_code;
}


public String getFirst() {
return first;
}


public String getLng() {
return lng;
}


public String getLat() {
return lat;
}


public void setId(int id) {
this.id = id;
}


public void setPid(int pid) {
this.pid = pid;
}


public void setShortname(String shortname) {
this.shortname = shortname;
}


public void setName(String name) {
this.name = name;
}


public void setMerger_name(String merger_name) {
this.merger_name = merger_name;
}


public void setLevel(int level) {
this.level = level;
}


public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}


public void setCode(String code) {
this.code = code;
}


public void setZip_code(String zip_code) {
this.zip_code = zip_code;
}


public void setFirst(String first) {
this.first = first;
}


public void setLng(String lng) {
this.lng = lng;
}


public void setLat(String lat) {
this.lat = lat;
}


@Override
public String toString() {
return "ProverAndCity [id=" + id + ", pid=" + pid + ", shortname=" + shortname + ", name=" + name
+ ", merger_name=" + merger_name + ", level=" + level + ", pinyin=" + pinyin + ", code=" + code
+ ", zip_code=" + zip_code + ", first=" + first + ", lng=" + lng + ", lat=" + lat + "]";
}


public ProverAndCity(int id, int pid, String shortname, String name, String merger_name, int level, String pinyin,
String code, String zip_code, String first, String lng, String lat) {
super();
this.id = id;
this.pid = pid;
this.shortname = shortname;
this.name = name;
this.merger_name = merger_name;
this.level = level;
this.pinyin = pinyin;
this.code = code;
this.zip_code = zip_code;
this.first = first;
this.lng = lng;
this.lat = lat;
}


public ProverAndCity() {
super();
}


}

五、Modle层
public class CityModel implements FindAll {


private Context context;


private String result;


public CityModel(Context context) {
super();
this.context = context;
}


@Override
public void findAllDate(AsynCallBack callback) {


StringBuilder sb = new StringBuilder();
try {
InputStream is = context.getAssets().open("sh_area.json");


byte[] buf = new byte[3749];
int len = -1;
while ((len = is.read(buf)) != -1) {
sb.append(new String(buf, 0, len, "UTF-8"));


}
is.close();
result = sb.toString();


JSONObject obj = new JSONObject(result);
String resutls = obj.getString("RECORDS");


JSONArray jsonArray = new JSONArray(resutls);
List<ProverAndCity> lists = new ArrayList<ProverAndCity>();
for (int i = 0; i < buf.length; i++) {
JSONObject c_obj = jsonArray.getJSONObject(i);


ProverAndCity p = new ProverAndCity();
p.setId(c_obj.getInt("id"));
p.setPid(c_obj.getInt("pid"));
p.setShortname(c_obj.getString("shortname"));
p.setName(c_obj.getString("name"));
p.setMerger_name(c_obj.getString("merger_name"));
p.setLevel(c_obj.getInt("level"));
p.setPinyin(c_obj.getString("pinyin"));
p.setCode(c_obj.getString("code"));
p.setZip_code(c_obj.getString("zip_code"));
p.setFirst(c_obj.getString("first"));
p.setLng(c_obj.getString("lng"));
p.setLat(c_obj.getString("lat"));
lists.add(p);
}
callback.onDataLoader(lists);


} catch (Exception e) {
e.printStackTrace();
}


}


}

六、接口AsynCallBack  FindAll


public interface AsynCallBack {
// 获取成功后执行的方法
void onDataLoader(Object obj);


// 获取数据失败后执行方法
void onErrorLoader(String msge);


}

public interface FindAll {


/**
* 获取数据的方法

* @param pager
*            变量参数
* @param callback
*            回调方法
*/


void findAllDate(AsynCallBack callback);
}
省市县三级联动(带拼音、首字母、经纬度坐标)




源码下载:http://download.****.net/download/android_joke/9930879