1. 程式人生 > >SpannableString使用注意(資料重複時,顯示異常問題解決)

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); } }

效果圖:
這裡寫圖片描述

說明:我要的效果,是把資料中的“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);
            }
        }

效果圖:
這裡寫圖片描述

這裡,使用2個變數,記錄下一次的開始位置。避免一個數據重複出現時,開始位置計算錯誤的問題