1、需求:listview的item中默认显示人员姓名、证件类型、证件类型对应的证件号(证件号为空时不显示),初始显示身份证及对应证件号,用户可动态选择其他证件类型,有对应的证件号则带入,没有显示为空可输入。
2、分析:动态修改item显示后滑动listview,item复用会导致修改后的显示丢失,需对修改的view设置tag并且用HashMap做缓存纪录每次修改后的数据。
完整代码:
public class IdentityInfoConfirmActivity extends BaseActivity implements View.OnClickListener { private String cancelRule; private String bedType; // 是否显示担保信息 private boolean isSetAssureInfo; private OrderHotelModel orderHotelModel; private HotelLimitBean hotelLimit;//第一次校验,超标对象 // 顶部按钮信息 private Button bt_left, bt_right; private TextView tv_title; //证件信息 private ListView mLvIdentityInfo; private ArrayList<CommonUserInfo> users = new ArrayList<>(); private IdentityAdapter mAdapter; //底部确认按钮 private Button btn_submit_ok; private ArrayList<String> cardTypes; private int defaultItemType; private static final int CODETYPEID = 0; private static final int CODETYPEJUNGUAN = CODETYPEID + 1; private static final int CODETYPEHUZHAO = CODETYPEJUNGUAN + 1; private static final int CODETYPEHUIXIANG = CODETYPEHUZHAO + 1; private static final int CODETYPETAIBAO = CODETYPEHUIXIANG + 1; private static final int CODETYPEGANGAOTONGXING = CODETYPETAIBAO + 1; private static final int CODETYPEQITAYOUXIAO = CODETYPEGANGAOTONGXING + 1; private HashMap<Integer, String> idType = new HashMap<>(); private HashMap<Integer, String> idNo = new HashMap<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_identity_info_confirm); cancelRule = getIntent().getStringExtra("cancelRule"); bedType = getIntent().getStringExtra("bedType"); isSetAssureInfo = getIntent().getBooleanExtra("isSetAssureInfo", false); if (getIntent().getSerializableExtra("orderHotelModel") != null) { orderHotelModel = (OrderHotelModel) getIntent() .getSerializableExtra("orderHotelModel"); } hotelLimit = (HotelLimitBean) getIntent().getSerializableExtra("preHotelLimit"); users = (ArrayList<CommonUserInfo>) getIntent().getSerializableExtra("identityUsers"); initView(); } private void initView() { bt_left = (Button) findViewById(R.id.buton_titlebar_left); bt_left.setOnClickListener(this); bt_right = (Button) findViewById(R.id.buton_titlebar_right); bt_right.setVisibility(View.INVISIBLE); tv_title = (TextView) findViewById(R.id.textView_msgtitlebar_topname); tv_title.setText("证件信息确认"); mLvIdentityInfo = (ListView) findViewById(R.id.lv_identity_info); mAdapter = new IdentityAdapter(this, users); mLvIdentityInfo.setAdapter(mAdapter); btn_submit_ok = (Button) findViewById(R.id.btn_submit_ok); btn_submit_ok.setOnClickListener(this); //初始化可选择的证件类型 cardTypes = new ArrayList<String>(); cardTypes.add("身份证"); cardTypes.add("军官证"); cardTypes.add("护照"); cardTypes.add("回乡证"); cardTypes.add("台胞证"); cardTypes.add("港澳通行证"); cardTypes.add("其他有效证件"); defaultItemType = CODETYPEID; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.buton_titlebar_left: finish(); break; case R.id.btn_submit_ok: Intent intent = intent = new Intent(this, OrderHotelSubmitActivity1.class); intent.putExtra("cancelRule", cancelRule); intent.putExtra("bedType", bedType); intent.putExtra("isSetAssureInfo", isSetAssureInfo); intent.putExtra("orderHotelModel", orderHotelModel); intent.putExtra("preHotelLimit", hotelLimit); this.startActivity(intent); break; } } class IdentityAdapter extends BaseAdapter { private Context mContext; private LayoutInflater mInflater; private ArrayList<CommonUserInfo> users; public IdentityAdapter(Context context, ArrayList<CommonUserInfo> users) { this.mContext = context; this.users = users; this.mInflater = LayoutInflater.from(context); } @Override public int getCount() { return users.size(); } @Override public Object getItem(int position) { return users.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = mInflater.inflate(R.layout.identity_info_item, parent, false); viewHolder = new ViewHolder(); viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); viewHolder.tv_id_type = (TextView) convertView.findViewById(R.id.tv_id_type); viewHolder.tv_id_num = (EditText) convertView.findViewById(R.id.tv_id_num); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); //加标志位防止数据错乱 viewHolder.tv_id_type.setTag(position); viewHolder.tv_id_num.setTag(position); } CommonUserInfo userInfo = users.get(position); viewHolder.tv_name.setText(userInfo.getNameCn()); viewHolder.tv_id_type.setTag(position); viewHolder.tv_id_num.setTag(position); //缓存不为空显示新的数据 if (StringUtil.isValid(idType.get(position))) { viewHolder.tv_id_type.setText(idType.get(position)); viewHolder.tv_id_num.setText(idNo.get(position)); } else { //初始显示身份证及对应的证件号 viewHolder.tv_id_type.setText("身份证"); viewHolder.tv_id_num.setText(""); if (StringUtil.isValid(userInfo.getCertitype())) { if (userInfo.getCertitype().equals(CommonConst.IDO) || userInfo.getCertitype().equals("身份证") || userInfo.getCertitype().equals(CommonConst.ID)) { viewHolder.tv_id_num.setText(userInfo.getCertinum()); }else if (userInfo.getUserCardList() != null && userInfo.getUserCardList().size() > 0) { for (int i = 0; i < userInfo.getUserCardList().size(); i++) { UserCard userCard = userInfo.getUserCardList().get(i); if (userCard.getCardType().equals(CommonConst.IDO) || userInfo.getCertitype().equals("身份证") || userInfo.getCertitype().equals(CommonConst.ID)) { viewHolder.tv_id_num.setText(userCard.getCardId()); } } } } else if (userInfo.getUserCardList() != null && userInfo.getUserCardList().size() > 0) { for (int i = 0; i < userInfo.getUserCardList().size(); i++) { UserCard userCard = userInfo.getUserCardList().get(i); if (userCard.getCardType().equals(CommonConst.IDO) || userInfo.getCertitype().equals("身份证") || userInfo.getCertitype().equals(CommonConst.ID)) { viewHolder.tv_id_num.setText(userCard.getCardId()); } } } } viewHolder.tv_id_num.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { //输入框内容修改后map缓存对应位置及修改后的数据 int pos = (Integer) viewHolder.tv_id_num.getTag(); idNo.put(pos, s.toString()); } }); viewHolder.tv_id_type.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final List<Map<String, Object>> cardTypesList = new ArrayList<Map<String, Object>>(); for (int i = 0; i < cardTypes.size(); i++) { Map<String, Object> ad = new HashMap<String, Object>(); ad.put("id", i); ad.put("name", cardTypes.get(i)); if (cardTypes.get(i).equals(viewHolder.tv_id_type.getText().toString())) { defaultItemType = i; } cardTypesList.add(ad); } //底部弹窗选择证件类型 SelectCardTypeDialog selectId = new SelectCardTypeDialog(IdentityInfoConfirmActivity.this, R.style.ListDialog, defaultItemType, cardTypesList, "flight"); selectId.setOnScrollListener(new SelectCardTypeDialog.OnScrollListener() { @Override public void onScroll(int result) { // TODO Auto-generated method stub defaultItemType = result; Map<String, Object> pm = cardTypesList.get(result); String time = pm.get("name").toString(); viewHolder.tv_id_type.setText(time); //证件类型修改后map缓存对应位置及修改后的数据 int pos = (Integer) viewHolder.tv_id_type.getTag(); idType.put(pos, time); viewHolder.tv_id_num.setText(""); String codetypeArr[] = {"01012001", "01012005", "01012002", "01012003", "01012004", "01012006", "01012007"}; if (StringUtil.isValid(userInfo.getCertitype())) { if(codetypeArr[defaultItemType].equals(userInfo.getCertitype())){ viewHolder.tv_id_num.setText(userInfo.getCertinum()); }else if (userInfo.getUserCardList() != null && userInfo.getUserCardList().size() > 0) { for (int i = 0; i < userInfo.getUserCardList().size(); i++) { UserCard userCard = userInfo.getUserCardList().get(i); if (codetypeArr[defaultItemType].equals(userCard .getCardType())) { viewHolder.tv_id_num.setText(userCard.getCardId()); } } } } else if (userInfo.getUserCardList() != null && userInfo.getUserCardList().size() > 0) { for (int i = 0; i < userInfo.getUserCardList().size(); i++) { UserCard userCard = userInfo.getUserCardList().get(i); if (codetypeArr[defaultItemType].equals(userCard .getCardType())) { viewHolder.tv_id_num.setText(userCard.getCardId()); } } } //选择证件类型为护照时可录入括号 if (viewHolder.tv_id_type != null) { String documents = viewHolder.tv_id_type.getText().toString(); String digits = ""; if (StringUtil.isValid(documents) && CommonConst.PASSPORTOS.equals(documents)) { digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ()()"; } else { digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; } viewHolder.tv_id_num.setKeyListener(DigitsKeyListener.getInstance(digits)); } } }); selectId.show(Gravity.BOTTOM); } }); return convertView; } class ViewHolder { public TextView tv_name; public TextView tv_id_type; public EditText tv_id_num; } } }