这个效果的其实就是列表数据的刷新,选择对应的省份同时获取其下面的城市数据并刷新列表,选择对应的城市同时获取其下面的区县数据并刷新列表,并将选择好的数据返回给上一个页面;当触发返回或者物理返回键的时候做同样的处理就可以了。
实现主要代码:
public class DataActivity extends AppCompatActivity implements View.OnClickListener {
private TextView tvBack;
private ListView listview;
private ChoseDataAdapter choseDataAdapter;
private List<PlaceInfo> pList = new ArrayList<>();
private int cityIndex = 0;
private String prvStr, cityStr, townCity;//省份名称 城市名称 区县名称
private String prvId, cityId, townId;//省份id 城市id 区县id
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_data);
initView();
}
private void initView() {
tvBack = (TextView) findViewById(R.id.tv_back);
tvBack.setOnClickListener(this);
ParseData.jsonToData(this);
//省份数据
pList = PrioviceInfo.getProvice();
listview = (ListView) findViewById(R.id.listview);
listview.setDivider(null);
choseDataAdapter = new ChoseDataAdapter(DataActivity.this, pList);
listview.setAdapter(choseDataAdapter);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cityIndex++;
if (cityIndex == 1) {
PlaceInfo placeInfo = pList.get(position);
//获取选择的省份名称和id
prvStr = stringTOString(placeInfo.dict_name);
prvId = stringTOString(placeInfo.dict_id);
//获取选择该省份对应的市县
pList = PrioviceInfo.getCity(prvId);
if (pList.size() == 0) {
placeInfo.valueName = prvStr;
placeInfo.id_1 = prvId;
getDataBack(placeInfo);
} else {
//刷新城市数据并显示
choseDataAdapter.nodfiyData(pList);
}
} else if (cityIndex == 2) {
PlaceInfo cityInfo = pList.get(position);
//获取选择的城市名称和id
cityStr = stringTOString(cityInfo.dict_name);
cityId = stringTOString(cityInfo.dict_id);
//获取选择的城市对应的区县数据
pList = PrioviceInfo.getTown(cityId);
if (pList.size() == 0) {
cityInfo.valueName = prvStr + " " + cityStr;
cityInfo.id_1 = prvId;
cityInfo.id_2 = cityId;
getDataBack(cityInfo);
} else {
//刷新显示区县数据
choseDataAdapter.nodfiyData(pList);
}
} else if (cityIndex == 3) {
PlaceInfo townInfo = pList.get(position);
townCity = stringTOString(townInfo.dict_name);
townId = stringTOString(townInfo.dict_id);
townInfo.valueName = prvStr + " " + cityStr + " " + townCity;
townInfo.id_1 = prvId;
townInfo.id_2 = cityId;
townInfo.id_3 = townId;
getDataBack(townInfo);
}
}
});
}
/**
* 返回上一级页面,并返回好的数据
*
* @param info
*/
private void getDataBack(PlaceInfo info) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putSerializable("datainfo", info);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
finish();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_back:
toBack();
break;
}
}
class ChoseDataAdapter extends DefaultAdapter<PlaceInfo> {
public ChoseDataAdapter(Context context, List<PlaceInfo> list) {
super(context, list);
}
@Override
protected BaseHolder<PlaceInfo> getHolder() {
return new ChoseDataHolder();
}
@Override
public void refreshUi(View convertView, int position) {
}
}
class ChoseDataHolder extends BaseHolder<PlaceInfo> {
TextView valueText;
@Override
public void refreshView(List<PlaceInfo> list, int pos) {
PlaceInfo sysBasicData = list.get(pos);
this.valueText.setText("" + sysBasicData.dict_name);
}
@Override
public View initView() {
View convertView = View.inflate(DataActivity.this, R.layout.chose_data_view, null);
this.valueText = findID(convertView, R.id.valueText);
return convertView;
}
}
private String stringTOString(String value) {
return value == null ? "" : value;
}
/**
* 返回方法
*/
private void toBack() {
cityIndex--;
if (cityIndex == 1) {
//显示上一级城市
pList = PrioviceInfo.getCity(prvId);
choseDataAdapter.nodfiyData(pList);
} else if (cityIndex== 0) {
pList=PrioviceInfo.getProvice();
choseDataAdapter.nodfiyData(pList);
} else if (cityIndex == -1) {
finish();
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
toBack();
}
return true;
}
}
这样子就可以了。