这里首先实现指定的txt文件的解析以及处理:
首先是解析方法:读取txt后根据关键字分章节分标题处理

package com.example.read_txt_highlight;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.regex.Matcher;import java.util.regex.Pattern;import android.annotation.SuppressLint;@SuppressLint("NewApi")public class TxtReadMethod {    public static final int UNIT=0;    public static final int LESSON=1;    public static final int CONTENT=2;    /**     * 通过一个InputStream获取内容     *      * @param inputStream     * @return     */    public static ArrayList getString(InputStream inputStream) {        ArrayList unitDataList=new ArrayList();        InputStreamReader inputStreamReader = null;        try {            inputStreamReader = new InputStreamReader(inputStream, "utf-8");        } catch (UnsupportedEncodingException e1) {            e1.printStackTrace();        }        BufferedReader reader = new BufferedReader(inputStreamReader);        StringBuffer sb = new StringBuffer("");        StringBuffer titleSb = new StringBuffer("");        String line;        String regularUnit = "Unit\\s*\\d";        String regularLesson = "Lesson\\s*\\d";        int unitId = 0;        int lessonId = 0;        boolean upLesson = false;        boolean firstContent = false;        int matchId;        String matchContent;        UnitData unitData=new UnitData();        ArrayList articleList=new ArrayList();        Article article=new Article();        try {            while ((line = reader.readLine()) != null) {                TxtMatch matchGet = regularGroup(regularUnit,                        regularLesson, line);                matchId = matchGet.getMatch();                matchContent=matchGet.getContent();                switch (matchId) {                case UNIT:                    if(unitId!=0){                        unitData.setArticle(articleList);                        unitDataList.add(unitData);                        articleList=new ArrayList();                    }                    unitId++;                    unitData=new UnitData();                    unitData.setUnit(unitId);                    break;                case LESSON:                    if(lessonId!=0){                        article.setContent(sb.toString());                        articleList.add(article);                        sb.delete(0,sb.length()-1);                    }                    lessonId++;                    //创建新的Article                    article=new Article();                    upLesson=true;                    article.setLessonId(lessonId);                    break;                case CONTENT:                    //赋值给标题或者正文                    if(upLesson&&firstContent){                        titleSb.append(" ");                        titleSb.append(matchContent.replaceAll(" ",""));                        article.setTitle(titleSb.toString());                        titleSb.delete(0,titleSb.length());                        upLesson=false;                        firstContent=false;                    }else if(upLesson){                        titleSb.append(matchContent.trim());                        firstContent=true;                    }else{                        sb.append(matchContent);                        sb.append("\n");                        upLesson=false;                    }                    break;                default:                    break;                }            }        } catch (IOException e) {            e.printStackTrace();        }        unitData.setArticle(articleList);        unitDataList.add(unitData);        return unitDataList;    }    //解析    private static TxtMatch regularGroup(String patternUnit,String patternLesson, String matcher) {        TxtMatch txtMatch =new TxtMatch();        Pattern p = Pattern.compile(patternUnit, Pattern.CASE_INSENSITIVE);        Matcher m = p.matcher(matcher);        if (m.find()) { // 如果读到            txtMatch.setMatch(UNIT);            txtMatch.setContent(m.group());            return txtMatch;// 返回捕获的数据        }else{            Pattern pL = Pattern.compile(patternLesson, Pattern.CASE_INSENSITIVE);            Matcher mL = pL.matcher(matcher);            if(mL.find()){                txtMatch.setMatch(LESSON);                txtMatch.setContent(mL.group());                return txtMatch;// 返回捕获的数据            }else{                txtMatch.setMatch(CONTENT);                txtMatch.setContent(matcher);                return txtMatch;            }        }    }}

然后是调用实现的Activity,这里的TextView使用开源的PinnedSectionListView

package com.example.read_txt_highlight;import java.io.InputStream;import java.util.ArrayList;import android.app.ListActivity;import android.content.Context;import android.content.Intent;import android.graphics.Color;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;import com.example.read_txt_highlight.PinnedSectionListView.PinnedSectionListAdapter;public class TxtReadActivity extends ListActivity {    private static final String INTENT_CONTENT = "content";    private static final String INTENT_TITLE = "title";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        InputStream inputStream = getResources().openRawResource(R.raw.new4);//需要读取的txt文档        ArrayList unitDatas = TxtReadMethod.getString(inputStream);        setListAdapter(new SimpleAdapter(this,                android.R.layout.simple_list_item_1, android.R.id.text1,                unitDatas));    }    /**     * 使用PinnedListview实现效果     *     */    static class SimpleAdapter extends ArrayAdapter implements            PinnedSectionListAdapter {        ArrayList unitDatas = new ArrayList();        private static final int[] COLORS = new int[] { R.color.orange_light,                R.color.blue_light, R.color.red_light };//章节颜色背景        public SimpleAdapter(Context context, int resource,                int textViewResourceId, ArrayList unitDatas) {            super(context, resource, textViewResourceId);            this.unitDatas = unitDatas;            generateDataset('1', '3', false);//需要根据具体需求修改        }        public void generateDataset(char from, char to, boolean clear) {            if (clear)                clear();            final int sectionsNumber = to - from + 1;            prepareSections(sectionsNumber);            int sectionPosition = 0, listPosition = 0;            for (char i = 0; i < sectionsNumber; i++) {                UnitData unitData = unitDatas.get(i);                Item section = new Item(Item.SECTION, "Unit "                        + String.valueOf(i + 1), "");                section.sectionPosition = sectionPosition;                section.listPosition = listPosition++;                onSectionAdded(section, sectionPosition);                add(section);                ArrayList articles = unitData.getArticle();                int itemsNumber = articles.size();                for (int j = 0; j < itemsNumber; j++) {                    Article article = articles.get(j);                    Item item = new Item(Item.ITEM, article.getTitle(),                            article.getContent());                    item.sectionPosition = sectionPosition;                    item.listPosition = listPosition++;                    add(item);                }                sectionPosition++;            }        }        protected void prepareSections(int sectionsNumber) {        }        protected void onSectionAdded(Item section, int sectionPosition) {        }        //由于没有图片等资源 此处未进行Listview优化,实际使用时需要对此进行优化        @Override        public View getView(int position, View convertView, ViewGroup parent) {            TextView view = (TextView) super.getView(position, convertView,                    parent);            view.setTextColor(Color.DKGRAY);            view.setTag("" + position);            Item item = getItem(position);            if (item.type == Item.SECTION) {                view.setBackgroundColor(parent.getResources().getColor(                        COLORS[item.sectionPosition % COLORS.length]));            } else {                view.setTextSize(14);            }            return view;        }        @Override        public int getViewTypeCount() {            return 2;        }        @Override        public int getItemViewType(int position) {            return getItem(position).type;        }        @Override        public boolean isItemViewTypePinned(int viewType) {            return viewType == Item.SECTION;        }    }    @Override    protected void onListItemClick(ListView l, View v, int position, long id) {        Item item = (Item) getListView().getAdapter().getItem(position);        if (item != null && !(item.content).equals("")) {            Intent contentIntent = new Intent(TxtReadActivity.this,                    ArticleContentActivity.class);            contentIntent.putExtra(INTENT_CONTENT, item.content);            contentIntent.putExtra(INTENT_TITLE, item.title);            startActivity(contentIntent);        }    }}

接下来是词库中或者你指定的字符集在TextView中的高亮显示:

/**     * 根据等级匹配对应单词 并高亮显示     *      * @param level     */    private void spanWord(int level) {        SpannableStringBuilder style = new SpannableStringBuilder(mContent                .getText().toString());        for (int i = 0; i < level; i++) {            ArrayList arrayList = wordList.get(i);            for (int j = 0; j < arrayList.size(); j++) {                Pattern p = Pattern.compile(arrayList.get(j));                Matcher m = p.matcher(style);                while (m.find()) {                    int start = m.start();                    int end = m.end();                    style.setSpan(new ForegroundColorSpan(Color.RED), start,                            end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                }            }        }        mContent.setText(style);    }

这个可以将文本以及词库存储到本地数据库,加快访问速度和效率,这里只提供了大致思路,如有更佳方案,欢迎留言。

更多相关文章

  1. 安卓开发之去标题栏
  2. ActionBar setDisplayOptions 使用详解
  3. [Android]Toolbar使用详解(三)——源码解析
  4. Android沉浸式标题栏状态栏字体颜色修改(小米和魅族以及Android6.
  5. android 全屏 无标题
  6. Activity去掉标题栏失败(使用AppCompat)
  7. android应用中去掉标题栏的方法
  8. Android(安卓)标题栏上加一个返回按钮 超简单的返回
  9. Android中隐藏标题栏和状态栏(电源,信号,时间等信息)

随机推荐

  1. Android手机开发:ImageView使用和从内存读
  2. Android中Log的输出
  3. Android(安卓)定时服务
  4. android之Fragment-ListFragment的实践(三
  5. android 混淆 proguard
  6. android Toast工具BToast
  7. Android设置界面之Preference
  8. Android UDP广播包抓取
  9. 阅读《Android 从入门到精通》(13)——日期
  10. DecimalFormat 实现保留小数点位数及四舍