这个功能就类似于自己输入自己的所在地,当你选择一个所在地的话,你所在地相对应的地方就能在下一个列表里展示出来,这个功能主要考的事,你对json解析的理解,如果这个会的话,json解析就不在话下了。
既然是省、市、区,所以bean类要这样写,省包含市,市包含区,下面展示一下bean类
import java.util.List;
public class ProivenceBean {
private String proivenceName;
private List<CityBean> cityList;
public String getProivenceName() {
return proivenceName;
}
public void setProivenceName(String proivenceName) {
this.proivenceName = proivenceName;
}
public List<CityBean> getCityList() {
return cityList;
}
public void setCityList(List<CityBean> cityList) {
this.cityList = cityList;
}
}
市
import java.util.List;
public class CityBean {
private String cityName;
private List<String> zoneList;
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public List<String> getZoneList() {
return zoneList;
}
public void setZoneList(List<String> zoneList) {
this.zoneList = zoneList;
}
}
下面是适配器,这个适配器的区别,就在于,在条目设置当中需要继承自相对应的bean类,因为是包含关系,就两个bean类,区相对应的继承自String就可以的。
import java.util.List;
import cn.bgs.sanjiliandong.R;
import cn.bgs.sanjiliandong.bean.CityBean;
import cn.bgs.sanjiliandong.bean.ProivenceBean;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MyAdaper<T> extends BaseAdapter {
private Context context;
private List<T> list;
public MyAdaper(Context context,List<T> list) {
this.context=context;
this.list=list;
}
//刷新的方法
public void refrush(List<T> data){
this.list=data;
notifyDataSetChanged();
}
@Override
public int getCount() {
if(list!=null){
return list.size();
}
return 0;
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder=new ViewHolder();
convertView=View.inflate(context, R.layout.adapter, null);
holder.tv=(TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
if(getItem(position) instanceof ProivenceBean){//省级信息
holder.tv.setText(((ProivenceBean)list.get(position)).getProivenceName());
}else if(getItem(position) instanceof CityBean){//市
holder.tv.setText(((CityBean)list.get(position)).getCityName());
}else if(getItem(position) instanceof String){//区
holder.tv.setText(((String)list.get(position)));
}
return convertView;
}
private static class ViewHolder{
private TextView tv;
}
}
接下来就是解析了,我在代码里面加了注释,如果你熟悉了其中的解析方式,这个也很简单的
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import cn.bgs.sanjiliandong.adapter.MyAdaper;
import cn.bgs.sanjiliandong.bean.CityBean;
import cn.bgs.sanjiliandong.bean.ProivenceBean;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.res.AssetManager;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView provienceTv,cityTv,zoneTv;
private ListView provienceLv,cityLv,zoneLv;
private MyAdaper<ProivenceBean> proivenceAdapter;
private MyAdaper<CityBean> cityAdapter;
private MyAdaper<String> zoneAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private Handler hand=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//TODO 接受子线程发送的消息
if(msg.what==1){
List<ProivenceBean> resultList=(List<ProivenceBean>) msg.obj;
if(proivenceAdapter!=null){
proivenceAdapter.refrush(resultList);
}else{
proivenceAdapter=new MyAdaper<ProivenceBean>(MainActivity.this, resultList);
provienceLv.setAdapter(proivenceAdapter);
}
}
}
};
private void initView() {
provienceTv=(TextView) findViewById(R.id.provienceTv);
cityTv=(TextView) findViewById(R.id.cityTv);
zoneTv=(TextView) findViewById(R.id.zoneTv);
provienceLv=(ListView) findViewById(R.id.provienceLv);
cityLv=(ListView) findViewById(R.id.cityLv);
zoneLv=(ListView) findViewById(R.id.zoneLv);
provienceLv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
MyAdaper<ProivenceBean> adapter=(MyAdaper<ProivenceBean>) parent.getAdapter();
ProivenceBean bean=(ProivenceBean) adapter.getItem(position);
String name=bean.getProivenceName();
provienceTv.setText(name);
if(cityAdapter!=null){
cityAdapter.refrush(bean.getCityList());
}else{
cityAdapter=new MyAdaper<CityBean>(MainActivity.this, bean.getCityList());
cityLv.setAdapter(cityAdapter);
}
if(zoneAdapter!=null){
zoneAdapter.refrush(null);
}
}
});
cityLv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
MyAdaper<CityBean> adapter=(MyAdaper<CityBean>) parent.getAdapter();
CityBean bean=(CityBean) adapter.getItem(position);
String name=bean.getCityName();
cityTv.setText(name);
if(zoneAdapter!=null){
zoneAdapter.refrush(bean.getZoneList());
}else{
zoneAdapter=new MyAdaper<String>(MainActivity.this, bean.getZoneList());
zoneLv.setAdapter(zoneAdapter);
}
}
});
zoneLv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
MyAdaper<String> adaper=(MyAdaper<String>) parent.getAdapter();
zoneTv.setText((String)adaper.getItem(position));
}
});
initList();
}
private void initList() {
new Thread(new Runnable() {
@Override
public void run() {
//关联文件
// String path=Environment.getExternalStorageDirectory()+"/ssq.txt";
// File file=new File(path);
AssetManager manager = getResources().getAssets();
try {
InputStream inputStream = manager.open("ssq.txt");
BufferedReader br=new BufferedReader(new InputStreamReader(inputStream));
StringBuffer sb=new StringBuffer();
String line="";
while((line=br.readLine())!=null){
sb.append(line);
}
br.close();
String result=sb.toString();
JSONArray jsonarray=new JSONArray(result);
List<ProivenceBean> provienceList=new ArrayList<ProivenceBean>();
if(jsonarray!=null){
for(int i=0;i<jsonarray.length();i++){
JSONObject proivenceObject = jsonarray.getJSONObject(i);
ProivenceBean proivencebean=new ProivenceBean();
if(proivenceObject.has("name")){
proivencebean.setProivenceName(proivenceObject.getString("name"));
if(proivenceObject.has("city")){
List<CityBean> cityList=new ArrayList<CityBean>();
JSONArray cityarray = proivenceObject.getJSONArray("city");
if(cityarray!=null){
for(int j=0;j<cityarray.length();j++){
JSONObject cityobObject = cityarray.getJSONObject(j);
CityBean citybean=new CityBean();
if(cityobObject.has("name")){
citybean.setCityName(cityobObject.getString("name"));
if(cityobObject.has("area")){
List<String> zoneList=new ArrayList<String>();
JSONArray zonearray = cityobObject.getJSONArray("area");
if(zonearray!=null){
for(int k=0;k<zonearray.length();k++){
String string=(String) zonearray.get(k);
zoneList.add(string);
}
}
citybean.setZoneList(zoneList);
}
}
cityList.add(citybean);
}
}
proivencebean.setCityList(cityList);
}
}
provienceList.add(proivencebean);
}
// 发送消息,从子线程发送到主线程
Message msg=hand.obtainMessage();
msg.what=1;
msg.obj=provienceList;
hand.sendMessage(msg);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}).start();
}
}
如果你使用我的这个小demo,就会用到一个自己的.txt 文件,你就看我上一个博客,把里面的内容copy进一个.txt 文件里面,然后放在自己的asseset文件夹下面即可