/**============================================================ * 版权: 久其软件 版权所有 (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); } }