SpannableString使用注意(数据重复时,显示异常问题解决)

之前我写过一篇博客介绍SpannableString的使用。
参见

http://blog.csdn.net/u014620028/article/details/50977602

但是今天发现我说的方法里有个bug。这里解决一下。在这里,感谢我的组长–李晓明(美女)。她的方法比我的简单。
初始化:

 TextView tv_show = (TextView) findViewById(R.id.tv_show);

 String content = "浪花淘33我英雄。是非成败转头空,青山我旧在,几度3夕阳红。白我渔樵(qiáo)江渚(zhǔ)上,惯看我秋3月春风。一壶浊酒333喜相逢,古今33多少事,都付笑谈中。";

 SpannableString spannableString = new SpannableString(content);

首先,说明一下之前方法会出现的bug
1、代码:

 ArrayList<String> list = new ArrayList<String>();
                list.add("3");
                for (int i = 0; i < list.size(); i++) {
                    final String temp = list.get(i);
                    String temp_content = content;
                   int start=0;
                    while (temp_content.contains(temp)) {
                        spannableString.setSpan(new ClickableSpan() {
                                                    @Override
                                                    public void updateDrawState(TextPaint ds) {
                                                        super.updateDrawState(ds);
                                                        ds.setColor(Color.BLUE);
                                                        ds.setUnderlineText(false);
                                                    }
                                                    @Override
                                                    public void onClick(View widget) {
                                                        Utils.showToast(MainActivity.this, "点击了" + temp);
                                                    }
                                                }, start + temp_content.indexOf(temp), start + temp_content.indexOf(temp) + temp.length(),
                                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                        tv_show.setText(spannableString);
                        tv_show.setMovementMethod(LinkMovementMethod.getInstance());
                        start =temp_content.indexOf(temp) + temp.length();
                        temp_content = temp_content.substring(start);
                    }
                }

效果图:
SpannableString使用注意(数据重复时,显示异常问题解决)_第1张图片

说明:我要的效果,是把数据中的“3”,都变色,并且可以被点击。从效果图上看,变换的数据都乱了。

bug解决:

ArrayList<String> list = new ArrayList<String>();
        list.add("3");
        for (int i = 0; i < list.size(); i++) {
            final String temp = list.get(i);
            String temp_content = content;
            int startNew = 0;
            int startOld = 0;
            while (temp_content.contains(temp)) {
                spannableString.setSpan(new ClickableSpan() {
                                            @Override
                                            public void updateDrawState(TextPaint ds) {
                                                super.updateDrawState(ds);
                                                ds.setColor(Color.BLUE);
                                                ds.setUnderlineText(false);
                                            }

                                            @Override
                                            public void onClick(View widget) {
                                                Utils.showToast(MainActivity.this, "点击了" + temp);
                                            }
                                        }, startOld + temp_content.indexOf(temp), startOld + temp_content.indexOf(temp) + temp.length(),
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv_show.setText(spannableString);
                tv_show.setMovementMethod(LinkMovementMethod.getInstance());
                startNew =temp_content.indexOf(temp) + temp.length();
                startOld += startNew;
                temp_content = temp_content.substring(startNew);
            }
        }

效果图:
SpannableString使用注意(数据重复时,显示异常问题解决)_第2张图片

这里,使用2个变量,记录下一次的开始位置。避免一个数据重复出现时,开始位置计算错误的问题

你可能感兴趣的:(SpannableString使用注意(数据重复时,显示异常问题解决))