listview 动态更改数据滑动后显示错误问题

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值