Listview 中的item 每个addTextChangedListener 都被触发了

来源:互联网 发布:淘宝客服兼职 靠谱吗 编辑:程序博客网 时间:2024/05/17 08:45

最近遇到一个问题,在Listview 中的item 放个editview ,然后监听editview 的文本变化,来设置数组中的数,addTextChangedListener, 发现每个item的监听都被触发了,导致我的数组中的每个数都是一样的。。然后notifyDataSetChanged 后,就把界面Listview中的每个item中的文本框中的内容都变成刚才文本改的一样的。。

经过苦苦查询,终于找到解决方法,在此特别记录下。

第一步:在自定义的adapter 中定义一个记录是否用原始记录还是文本监听改变记录的标识符。

 private boolean ischange=true;

第二步
将监听放在初始化viewholder 的那段代码里面,在监听事件中判断标识符,如果是true则不做任何操作,false的话再接着操作。

第三步
将 在holder.product_ext.setText之前设置为标识符true,在holder.product_ext.setText之后设置为标识符false。

二,三步的代码如下:

    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        final OrderChanPin orderChanPin=mList.get(position);        ViewHolder holder;        if (convertView==null){            holder=new ViewHolder();            convertView= LayoutInflater.from(mContext).inflate(R.layout.commit_item,null);            holder.product_name= (TextView) convertView.findViewById(R.id.product_name);            holder.product_pic= (ImageView) convertView.findViewById(R.id.product_pic);            holder.product_rating= (RatingBar) convertView.findViewById(R.id.product_rating);            holder.product_ext= (EditText) convertView.findViewById(R.id.product_ext);            holder.gridView =(GridView)convertView.findViewById(R.id.gridView);            holder.lablegridView =(GridView)convertView.findViewById(R.id.gv_productlable);// 第二步            holder.product_ext.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) {                if (!ischange) {                    mList.get(position).setCommit(s + "");                }            }        });        holder.product_rating.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {            @Override            public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {                if (!ischange) {                    String str = String.valueOf(rating);                    str = str.substring(0, str.indexOf("."));                    orderChanPin.setRigbar(str);                    mList.get(position).setRigbar(str);                    notifyDataSetChanged();                }            }        });        convertView.setTag(holder);    }else {        holder= (ViewHolder) convertView.getTag();        }        //第三步        ischange =true;        holder.product_ext.setText(mList.get(position).getCommit());        if(!mList.get(position).getRigbar().isEmpty()){        holder.product_rating.setRating(Integer.parseInt(mList.get(position).getRigbar()));        }        ischange =false;        return convertView;        }

然后,这里代码中还有RatingBar 的这个组件,当根据setOnRatingBarChangeListener 这个监听来设置星级的时候,也会发生和文本监听变化类似的错误,会让整个Listview中的评星级都变成一样的等级。所以也需要和文本变化监听类似的处理方式。

如此处理后,即使复用viewholder 也不会发生改一个文本,所有的文本都变成一样的。

3 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻子干燥有点痛怎么办 泰迪狗鼻子烂了怎么办 小狗鼻子干脱皮怎么办 鼻子短怎么办除了手术 狗得了狗瘟怎么办 泰迪感染细小怎么办 痔疮术后肛门痒怎么办 肛门脓肿流血了怎么办 检查肛门拉屎了怎么办 怀孕期间肛门湿疹怎么办 头晕检查说没事怎么办 慢性咽喉炎引起的咳嗽怎么办 咽炎引起的咳嗽怎么办? 补牙换药后疼痛怎么办 深度伤口换药疼痛怎么办 孕妇肛门有蛲虫怎么办 孕妇上火拉血怎么办 孕期内检出血怎么办 顺产肛门脱肛了怎么办 怀孕痔疮老脱出怎么办 顺产后浑身酸疼怎么办 爬山后肌肉酸疼怎么办 手上打针胳膊疼怎么办 狗 打针后疼痛怎么办 流产后浑身酸疼怎么办 屋子里潮湿有味怎么办 墙潮湿发霉有味怎么办 当兵体检没有过怎么办 航空面试有纹身怎么办 儿童眼睛外斜视怎么办 大疆imu异常怎么办 新生儿血液回流不好怎么办 灌肠温度高了怎么办 炎症引起的咳嗽怎么办 90岁老人肠梗阻怎么办 84岁老人肠梗阻怎么办 婴儿开塞露后大便肚子疼怎么办 孕早期用开塞露肚子疼怎么办 冰点脱毛后刺痛怎么办 医院建不上档怎么办 dnf输入变繁体怎么办