我是靠谱客的博主 玩命荔枝,这篇文章主要介绍Listview 中的item 每个addTextChangedListener 都被触发了,现在分享给大家,希望可以做个参考。

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

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

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

复制代码
1
private boolean ischange=true;

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

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

二,三步的代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@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 也不会发生改一个文本,所有的文本都变成一样的。

最后

以上就是玩命荔枝最近收集整理的关于Listview 中的item 每个addTextChangedListener 都被触发了的全部内容,更多相关Listview内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部