/**============================================================
* 版权: 久其软件 版权所有 (c)
* 包: com.jiuqi.njt.widget
* 修改记录:
* 日期 作者 内容
* =============================================================
* 2013-8-5 liyue
* ============================================================*/
package com.jiuqi.njt.widget;
import java.io.Serializable;
import java.lang.reflect.UndeclaredThrowableException;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.BaseAdapter;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import com.jiuqi.mobile.nigo.comeclose.bean.base.AdminAreaBean;
import com.jiuqi.mobile.nigo.comeclose.exception.LoginException;
import com.jiuqi.mobile.nigo.comeclose.manager.base.IAdminAreaManager;
import com.jiuqi.mobile.nigo.comeclose.ws.client.ClientContext;
import com.jiuqi.njt.R;
import com.jiuqi.njt.data.MyApp;
import com.jiuqi.njt.data.OptsharepreInterface;
import com.jiuqi.njt.register.KAdminAreaBean;
import com.jiuqi.njt.register.KAdminAreaBeanUtil;
import com.jiuqi.njt.register.city.AdminAreaBeanDBUtil;
import com.jiuqi.njt.util.Constants;
import com.jiuqi.njt.util.ReturnObject;
import com.jiuqi.njt.util.TitleBarUtil;
import com.jiuqi.njt.util.UIUtil;
import com.jqyd.android.module.lbs.util.CheckState_interface;
/**
* <p>行政区划控件</p>
*
* <p>Copyright: 版权所有 (c)<br>
* Company: 久其</p>
*
* @author liyue
* @version 2013-8-5
*/
public class XzqhActivity extends Activity{
private Context context = this;
private String TAG = this.getClass().getName();
public interface OnCancelListener{
public void onCancel(View v);
}
public interface OnConfirmListener{
public void OnConfirm(View v);
}
private OnCancelListener onCancelListener;
private OnConfirmListener onConfirmListener;
private XzqhAdapter adapter;
// private MyListAdapter adapter;
private ListView listView;
private IAdminAreaManager manager;
private AdminAreaBean xzqh = null;
private AdminAreaBean pxzqh = null;
// private Button btnLeft;
private OptsharepreInterface sharePre;
// private static final int MAX_BTN_LEFT_CHARACTERS = 2;
public static Drawable IMG_BG_CHECKED = null;
public static Drawable IMG_BG = null;
private MyApp application;
private boolean isOnlyProvince;
private int level = 5; //默认选择5级
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
// Serializable serializableExtra = getIntent().getSerializableExtra("xzqhPara");
// XzqhPara xzqhPara = null;
// if(serializableExtra instanceof XzqhPara){
// xzqhPara = (XzqhPara)serializableExtra;
// }
// doinit(xzqhPara);
Serializable serializableExtra = getIntent().getSerializableExtra(Constants.PARAM_XZQH);
if(null == serializableExtra){
doinit(null);
}
else{
if(serializableExtra instanceof AdminAreaBean){
AdminAreaBean x = (AdminAreaBean)serializableExtra;
doinit(x);
}
}
// isOnlyProvince = getIntent().getBooleanExtra(Constants.PARAM_PROVINCE,false);
level = getIntent().getIntExtra(Constants.PARAM_LEVEL,5);
application = (MyApp)getApplicationContext();
sharePre = new OptsharepreInterface(this);
sharePre.removePre(Constants.SELECTED_XZQH_CODE);
IMG_BG_CHECKED = getResources().getDrawable(R.drawable.img_radiobox_checked);
IMG_BG = getResources().getDrawable(R.drawable.img_radiobox);
}
private void doinit(AdminAreaBean para){
initParam(para);
initWidget();
initListener();
initUI();
}
private void initParam(AdminAreaBean para){
if(null != para){
// this.onCancelListener = para.getOnCancelListener();
// this.onConfirmListener = para.getOnConfirmListener();
// pxzqh = para.getXzqh();
if("全国".equals(para.getName())){
para = null;
}
pxzqh = para;
}
}
private void initWidget(){
setContentView(R.layout.layout_template_listview);
listView = (ListView)findViewById(R.id.listView);
ViewStub rlTitleBar = (ViewStub)findViewById(R.id.titleBarStub);
TitleBarUtil.createXzqhTitleBar(this, rlTitleBar, "所在地", "", new OnClickListener(){
@Override
public void onClick(View v){
if(null != onCancelListener){
onCancelListener.onCancel(v);
}
//查上级行政区划
if(pxzqh != null){
if(pxzqh.getCode() == Constants.XZQH_ROOT_CODE){
finish();
}
else{
new GetDirectSubLevelXzqhTask().execute(pxzqh, null);
}
}
else{
finish();
}
}
}, "确定", new OnClickListener(){
@Override
public void onClick(View v){
if(null != onConfirmListener){
onConfirmListener.OnConfirm(v);
}
doConfirm();
}
});
// btnLeft = (Button)njtTitleBar.getBtnLeft();
// btnLeft.setText(Constants.BTN_BACK_TEXT);
}
protected void doConfirm(){
//Log.v(Constants.TAG, "xzqh:" + xzqh + "pxzqh:" + pxzqh);
AdminAreaBean a = null;
if(null == xzqh){
if(null != pxzqh){
a = pxzqh;
//UIUtil.showMsg(XzqhActivity.this, pxzqh.toString());
}
}
else{
a = xzqh;
//UIUtil.showMsg(XzqhActivity.this, xzqh.toString());
}
Intent data = new Intent();
data.putExtra(Constants.PARAM_XZQH, a);
setResult(RESULT_OK, data);
finish();
}
private void initListener(){
}
private void initUI(){
//接收上一界面传来的行政区划对象,如果为空,则认为是行政区划树的根节点
if(new CheckState_interface(XzqhActivity.this).checkConnection()){
new GetDirectSubLevelXzqhTask().execute(pxzqh);
}else{
UIUtil.showMsg(XzqhActivity.this, Constants.NETWORK_STATE_ERROR);
}
}
/**
* <p>行政区划返回对象</p>
*
* <p>Copyright: 版权所有 (c)<br>
* Company: 久其</p>
*
* @author liyue
* @version 2013-8-5
*/
public class XzqhReturnObject extends ReturnObject{
public String errorMsg;
public AdminAreaBean pxzqh = null;
//public AdminAreaBean xzqh = null;
}
/**
* <p>查询下级行政区划对象</p>
*
* <p>Copyright: 版权所有 (c)<br>
* Company: 久其</p>
*
* @author liyue
* @version 2013-8-5
*/
private class GetDirectSubLevelXzqhTask extends AsyncTask<AdminAreaBean, Void, XzqhReturnObject>{
Dialog pd = null;
@Override
protected void onPreExecute(){
pd = ProgressDialogStyle .createLoadingDialog(XzqhActivity.this,null);
pd.show();
}
@Override
protected XzqhReturnObject doInBackground(AdminAreaBean... params){
//实例化manager
XzqhReturnObject ro = new XzqhReturnObject();
ClientContext context = null;
try{
if(manager == null){
try {
context = application.getClientContext();
if(null == context){
context =
ClientContext.getClientContext(Constants.SERVER_URL, Constants.ANONYMOUS,
Constants.ANONYMOUS);
application.setClientContext(context);
}
manager = context.getManager(IAdminAreaManager.class);
} catch (Exception e) {
// if(e.getMessage().contains("重新登录")){
// context = ClientContext.getClientContext(Constants.SERVER_URL, Constants.ANONYMOUS, Constants.ANONYMOUS);
// manager = context.getManager(IAdminAreaManager.class);
// application.setClientContext(context);
// }
e.printStackTrace();
}
}
AdminAreaBean xzqh = null;
//如果length大于1,则查上级
if(params.length > 1){
xzqh = params[0];
AdminAreaBean p = manager.findByCode(xzqh.getpCode());
ro.data = manager.getClildNodes(p.getGuid());
ro.pxzqh = p; //manager.findByCode(xzqh.getpCode());
ro.isSuccess = true;
}
//否则就是查直接子集
else{
if(params[0] == null){
xzqh = manager.getRootNode();
}
else{
xzqh = params[0];
}
ro.data = manager.getClildNodes(xzqh.getGuid());
ro.pxzqh = xzqh; //manager.findByCode(xzqh.getpCode());
ro.isSuccess = true;
}
return ro;
}
catch(UndeclaredThrowableException e){
ro.isSuccess = false;
ro.exception = e;
ro.errorMsg = "UndeclaredThrowableException异常";
e.printStackTrace();
return ro;
}
catch(Exception e){
ro.isSuccess = false;
ro.exception = e;
ro.errorMsg = "其他异常";
e.printStackTrace();
return ro;
}
}
@Override
protected void onPostExecute(XzqhReturnObject result){
if(result.isSuccess){
if(result.pxzqh != null){
String xzqhName = result.pxzqh.getName();
if(!TextUtils.isEmpty(xzqhName)){
//特殊处理根节点
if(result.pxzqh.getCode() == 0 && result.pxzqh.getpCode() == -1){
// btnLeft.setText(Constants.BTN_BACK_TEXT);
}
else{
//只显示 MAX_BTN_LEFT_CHARACTERS 个字
// btnLeft.setText(xzqhName.length() > MAX_BTN_LEFT_CHARACTERS ? xzqhName.subSequence(0,
// MAX_BTN_LEFT_CHARACTERS) : xzqhName + "..");
}
}
}
XzqhActivity.this.pxzqh = result.pxzqh;
AdminAreaBean[] res = (AdminAreaBean[])result.data;
if(res.length > 0){
//临时测试
if(res[0].getLevel()==1)
{
AdminAreaBean[] newData =new AdminAreaBean[res.length+1];
for (int i = 0; i < newData.length; i++) {
if(i==0){
newData[0]=new AdminAreaBean();
newData[0].setName("全国");
newData[0].setProvinceName("全国");
newData[0].setProvinceCode(1);
}else{
newData[i] = res[i-1];
}
}
res = newData ;
}
adapter = new XzqhAdapter(res);
// adapter.registerDataSetObserver(dataSetObserver);
//防止异步任务查询超时,退出界面等问题
if(null != listView){
listView.setAdapter(adapter);
}
}
else{
setEmptyView();
}
}
else{
setEmptyView();
UIUtil.showMsg(XzqhActivity.this, result.getException().getMessage());
}
if(null != pd){
pd.dismiss();
}
}
private void setEmptyView(){
LayoutInflater inflater = LayoutInflater.from(XzqhActivity.this);
View emptyView = inflater.inflate(R.layout.listview_item_empty, null);
if(null != listView){
listView.setEmptyView(emptyView);
}
}
}
private class XzqhAdapter extends BaseAdapter{
private AdminAreaBean[] xzqhs;
private HashMap<Long, ViewHolder> mapAllHolders;
private LayoutInflater inflater;
public XzqhAdapter(AdminAreaBean[] xzqhs){
this.xzqhs = xzqhs;
mapAllHolders = new HashMap<Long, XzqhActivity.ViewHolder>();
inflater = LayoutInflater.from(XzqhActivity.this);
}
@Override
public int getCount(){
return xzqhs.length;
}
@Override
public Object getItem(int position){
return xzqhs[position];
}
@Override
public long getItemId(int position){
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder = null;
AdminAreaBean xzqh = xzqhs[position];
if(convertView == null){
convertView = inflater.inflate(R.layout.listview_item_xzqh, null);
TextView tvName = (TextView)convertView.findViewById(R.id.tvName);
RadioButton radioButton = (RadioButton)convertView.findViewById(R.id.checkBox);
ImageView ivRadioButton = (ImageView)convertView.findViewById(R.id.ivRadioButton);
holder = new ViewHolder();
holder.tvName = tvName;
holder.radioButton = radioButton;
holder.ivRadioButton = ivRadioButton;
//Log.v(Constants.TAG, "holder:" + holder + " xzqh:" + xzqh.toString());
convertView.setTag(holder);
mapAllHolders.put(xzqh.getCode(), holder);
}
else{
holder = (ViewHolder)convertView.getTag();
}
//RadioButton radioButton = holder.radioButton;
ImageView ivRadioButton = holder.ivRadioButton;
holder.tvName.setText(xzqh.getName());
// tvName.setText(xzqh.getName());
//Log.v(Constants.TAG, "selcode:"+sharepre.getPres(Constants.SELECTED_XZQH_CODE) + " position:" + position + " xzqh:" + xzqh);
// + " holder:"+holder + " convertView:" + convertView + " parent:"+ parent
//radioButton.setChecked(Long.parseLong(sharepre.getPres(Constants.SELECTED_XZQH_CODE)) == xzqh.getCode());
ivRadioButton.setImageDrawable(IMG_BG); //.setBackgroundDrawable
if(Long.parseLong(sharePre.getPres(Constants.SELECTED_XZQH_CODE)) == xzqh.getCode()){
// ivRadioButton.setBackgroundDrawable(IMG_BG_CHECKED);
ivRadioButton.setImageDrawable(IMG_BG_CHECKED);
}
ivRadioButton.setOnClickListener(new ImgOnClickListener(xzqh.getCode()));
convertView.setOnClickListener(new MyOnClickListener(xzqh.getCode()));
//radioButton.setOnCheckedChangeListener(new MyOnCheckedChangeListener(xzqh.getCode()));
return convertView;
}
public AdminAreaBean getBeanByCode(long code){
for(AdminAreaBean a : xzqhs){
if(a.getCode() == code){
return a;
}
}
return null;
}
//
/*
* 在listview每次刷新的时候会调用oncheck的方法,会调用check(false)
*/
private class MyOnCheckedChangeListener implements OnCheckedChangeListener{
private long _code;
MyOnCheckedChangeListener(long code){
this._code = code;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
// //Log.v(Constants.TAG, "MyOnCheckedChangeListener_code:"+_code);
if(isChecked){
AdminAreaBean _xzqh = getBeanByCode(_code);
//Log.v(Constants.TAG, "MyOnCheckedChangeListener_code:"+_code + " "+buttonView + " is checked");
if(_xzqh != null){
//因为是单选
// selcode = _code;
sharePre.putPres(Constants.SELECTED_XZQH_CODE, String.valueOf(_code));
for(Long k : mapAllHolders.keySet()){
ViewHolder holder = mapAllHolders.get(k);
holder.radioButton.setChecked(false);
}
buttonView.setChecked(true);
// mapSelectedStatus.clear();
// mapSelectedStatus.put(_xzqh.getCode(), true);
XzqhActivity.this.xzqh = _xzqh;
//把当前选中的code赋给adapter变量
}
// else{
// Log.v(Constants.TAG, "没找到行政区划");
// }
}
else{
//Log.v(Constants.TAG, "MyOnCheckedChangeListener_code:"+_code + " "+buttonView + " is NOT checked");
// mapSelectedStatus.clear();
// for(Long k : mapAllHolders.keySet()){
// ViewHolder vh = mapAllHolders.get(k);
// vh.checkBox.setChecked(false);
// }
// sharepre.removePre(Constants.SELECTED_XZQH_CODE);
// XzqhActivity.this.xzqh = null;
// if(Long.parseLong(sharepre.getPres(Constants.SELECTED_XZQH_CODE)) == _code){
// sharepre.removePre(Constants.SELECTED_XZQH_CODE);
// XzqhActivity.this.xzqh = null;
// }
}
//Log.v(Constants.TAG, "当前点选择的是:" + XzqhActivity.this.xzqh);
//Log.v(Constants.TAG, "当前xzqhStatus是:" + mapSelectedStatus.toString());
//Log.v(Constants.TAG, "xzqh:" + XzqhActivity.this.xzqh + "pxzqh:" + XzqhActivity.this.pxzqh);
}
}
private class ImgOnClickListener implements OnClickListener{
private long xzqhcode;
public ImgOnClickListener(long code){
this.xzqhcode = code;
}
@Override
public void onClick(View v){
AdminAreaBean _xzqh = getBeanByCode(xzqhcode);
//Log.v(Constants.TAG, "selcode before:"+sharepre.getPres(Constants.SELECTED_XZQH_CODE));
sharePre.putPres(Constants.SELECTED_XZQH_CODE, String.valueOf(xzqhcode));
for(Long k : mapAllHolders.keySet()){
ViewHolder holder = mapAllHolders.get(k);
// holder.ivRadioButton.setBackgroundDrawable(IMG_BG);
holder.ivRadioButton.setImageDrawable(IMG_BG);
}
if(Long.parseLong(sharePre.getPres(Constants.SELECTED_XZQH_CODE)) == xzqhcode){
// v.setBackgroundDrawable(IMG_BG_CHECKED);
((ImageView)v).setImageDrawable(IMG_BG_CHECKED);
}
XzqhActivity.this.xzqh = _xzqh;
//Log.v(Constants.TAG, "selcode after:"+sharepre.getPres(Constants.SELECTED_XZQH_CODE));
}
}
private class MyOnClickListener implements OnClickListener{
private long xzqhcode;
public MyOnClickListener(long code){
this.xzqhcode = code;
}
@Override
public void onClick(View v){
//如果是最后一级,则点击相当于确定
AdminAreaBean xzqh = getBeanByCode(xzqhcode);
if(xzqh.getLevel() == level||xzqh.getName().equals("全国")){
XzqhActivity.this.xzqh = xzqh;
doConfirm();
}
else{
//Log.v(Constants.TAG, "xzqh:" + XzqhActivity.this.xzqh + "pxzqh:" + XzqhActivity.this.pxzqh);
//Log.v(Constants.TAG, "当前点中的是:" + xzqh.toString());
if(!isOnlyProvince){
new GetDirectSubLevelXzqhTask().execute(xzqh);
}
}
}
}
}
private class ViewHolder{
public ImageView ivRadioButton;
public RadioButton radioButton;
public TextView tvName;
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + getOuterType().hashCode();
result = prime * result + ((radioButton == null) ? 0 : radioButton.hashCode());
result = prime * result + ((tvName == null) ? 0 : tvName.hashCode());
return result;
}
@Override
public boolean equals(Object obj){
if(this == obj) return true;
if(obj == null) return false;
if(getClass() != obj.getClass()) return false;
ViewHolder other = (ViewHolder)obj;
if(!getOuterType().equals(other.getOuterType())) return false;
if(radioButton == null){
if(other.radioButton != null) return false;
}
else if(!radioButton.equals(other.radioButton)) return false;
if(tvName == null){
if(other.tvName != null) return false;
}
else if(!tvName.equals(other.tvName)) return false;
return true;
}
private XzqhActivity getOuterType(){
return XzqhActivity.this;
}
}
@Override
public void finish(){
super.finish();
listView = null;
sharePre.removePre(Constants.SELECTED_XZQH_CODE);
}
}