您的位置:首页 > 其它

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

2016-05-05 17:49 471 查看
最近遇到一个问题,在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 也不会发生改一个文本,所有的文本都变成一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: