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

最近遇到一个问题,在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 也不会发生改一个文本,所有的文本都变成一样的。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值