ListView 中的 SpannableString 正则表达式

2023-12-12

我有一个 ListView,我使用自定义适配器将字符串集合绑定到它。我还在文本中的某些关键字下划线。我使用 SpannableString 和正则表达式来给单词加下划线,但我想知道这是否是最有效的方法?我注意到 java.util.regex.Matcher 和 regex.util.regex.Pattern 类的分配跟踪器中存在大量分配,这可能会导致我的应用程序中的内存泄漏。我知道正则表达式可能很昂贵,但我不确定是否有其他方法可以完成我需要做的事情。

    public class Main extends ListActivity
    {
         private static CustomAdapter adapter = null;
private static List<Keyword> keywords;
private static Matcher matcher;

    @Override
    public void onCreate(Bundle icicle) 
    {  
            List<Item> items = new ArrayList<Item>();
    keywords = GetKeywords();
        items = GetItems();
            adapter = new CustomAdapter();

            for (Item item : items)
                adapter.addItem(item);

            this.setListAdapter(adapter);

    adapter.notifyDataSetChanged();
    }

      /* ADAPTER */
 private class CustomAdapter extends BaseAdapter 
      {      
    private final List<Item> mData = new ArrayList<Item>();
    private final LayoutInflater mInflater;
    public CustomAdapter() {
        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(Item item) {
        mData.add(item);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        final ViewHolder holder;
        final Item item = (Item)this.getItem(position);

        if (convertView == null)
        {
            holder = new ViewHolder();

            convertView = mInflater.inflate(R.layout.main, parent, false);

            holder.text = (TextView)convertView.findViewById(R.id.text);

            convertView.setTag(holder);
        } 
        else 
        {
            holder = (ViewHolder)convertView.getTag();
        }

            holder.text.setText(Highlight(item.getTitle(), keywords, matcher), BufferType.SPANNABLE);

        return(convertView);
    }
}

static class ViewHolder {
    TextView text, date, site;
}

private SpannableString Highlight(String text, List<Keyword> keywords, Matcher matcher)
{
    final SpannableString content = new SpannableString(text);

    for (Keyword keyword : keywords)
    {
        matcher = Pattern.compile("\\b" + keyword + "\\b").matcher(text);

        if (matcher.find())
        {
            start = matcher.start();
            end = matcher.end();
            content.setSpan(new UnderlineSpan(), start, end, 0);
        }
    }
    }


    return content;
    }
}

You are创建大量您不需要的模式和匹配器。我建议您创建一个正则表达式来匹配所有关键字,如下所示:

private SpannableString Highlight(String text, List<Keyword> keywords)
{
  final SpannableString content = new SpannableString(text);

  if (keywords.size() > 0)
  {
    /* create a regex of the form: \b(?:word1|word2|word3)\b */
    StringBuilder sb = ne StringBuilder("\\b(?:").append(keywords.get(0).toString());
    for (int i = 1; i < keywords.size(); i++)
    {
      sb.append("|").append(keywords.get(i).toString());
    }
    sb.append(")\\b");

    Matcher m = Pattern.compile(sb.toString()).matcher(text);

    while (m.find())
    {
      content.setSpan(new UnderlineSpan(), m.start(), m.end(), 0);
    }
  }

  return content;
}

创建模式对象的成本相当昂贵,因此这才是您真正节省的地方。另一方面,匹配器相对便宜,这就是为什么我从使用静态实例切换到每次创建一个新实例的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ListView 中的 SpannableString 正则表达式 的相关文章

  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • ImageView 中的全尺寸图像

    我正在尝试在 ImageView 中绘制图像 但我希望它不缩放 并根据需要使用滚动条 我怎样才能做到这一点 现在我只有一个可绘制集作为 XML 中 ImageView 的 android src 这会自动缩放图像以适应屏幕宽度 我读到这可能
  • doInBackground 运行时是否可以停止 asynctask?

    我正在 ActivityB Oncreate 中创建异步任务 在该任务中 我正在运行无限 while 循环doInBackground 当我转到上一个活动并再次回到该活动时 创建了另一个异步任务 我的问题现在是两个无限 while 循环正在
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • Mailgun POST /messages API 总是抛出 401 禁止

    我正在尝试使用改造库在 Android 中发送 Mailgun POST messages API 请求 以下是改装要求 HTTP POSThttps api key xxx v3 sandboxxxx messages https api
  • PCRE 匹配 C 中的所有组

    我想使用 PCRE C 库递归地匹配一个组 e g pattern d subject 5 6 3 2 OVECCOUNT 30 pcrePtr pcre compile pattern 0 error erroffset NULL rc
  • 将标题设置为操作栏时出现空指针异常

    Error Caused by java lang NullPointerException Attempt to invoke virtual method void android app ActionBar setTitle java
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • Cordova 地理定位不适用于 Android

    我想在 Android 上使用地理定位 我用 Apache Cordova 编写应用程序 地理定位在 android 电脑模拟器和 android 手机上均不起作用 I try http cordova apache org docs en
  • 如何在 Android 清单文件中设置文本外观?

    是否可以做相当于 setTextAppearance context android R style TextAppearance Medium 在 Android 应用程序的清单文件中 android textAppearance and
  • 如何覆盖日期选择器的高度和宽度以填充父布局

    我有一个活动包含一个日期选择器 我想设置DatePicker适合屏幕 我试过这个答案 https stackoverflow com questions 6674667 how to customize date pickers width
  • htaccess 301 重定向 - 删除查询字符串 (QSA)

    我一直在努力处理一些 htaccess 重定向 我只是花了一些时间在堆栈上阅读和搜索 但无法获得适合我的场景的答案 我正在将旧客户端网站的 301 重定向到新客户端 旧页面有参数查询 我想从网址中删除它 menu php idCategor
  • 如何从SurfaceView绘制到Canvas?

    我正在尝试做简单的画家 问题是Android看起来有三个独立的Canvas并给我它来顺序绘制 我用以下方式制作了用户界面SurfaceView 把霍尔德从中拿走 Override protected void onCreate Bundle
  • 有没有办法在Android上创建一个三角形按钮?

    有没有办法创建一个三角形的按钮 我知道我可以将三角形图像作为背景 但这将使三角形之外的区域可单击 有没有办法固定按钮角 X 和 Y 以便我可以将其变成三角形 您可以覆盖OnTouch http developer android com r
  • 点击监听器的公共类

    我的所有 6 项活动中有 7 个按钮 所有 6 个按钮在所有活动中都具有相同的功能 如何为这 6 个按钮执行通用的单击事件侦听器 您可以创建一个实现 View OnClickListener 的新类 如下所示 public class My
  • 是否可以使用 Eclipse 的正则表达式搜索和替换转换为小写?

    我已经尝试过 L 但它似乎不是其语法的一部分 并且它的帮助没有提及任何可用的转换 我知道我可以并且知道如何从命令行执行此操作 但是 是否可以使用 Eclipse 的正则表达式搜索和替换进行大小写转换 您可以分两步完成 首先插入小写字母 那么
  • ormlite 将日期读取为 'yyyy-MM-dd'

    我需要读取给我的 sqlite 数据库 因此我无法更改表中的日期格式 yyyy MM dd 当我尝试使用 ormlite 为我生成对象时 使用以下注释 DatabaseField columnName REVISION DATE dataT
  • OpenGL ES 2.0 屏幕闪烁

    我面临着一个大问题 我正在使用带有 Android 4 0 3 的 Transformer tf101 选项卡 我的应用程序使用自定义 OpenGL ES 2 0 表面 我正在用纹理渲染多个平面 该纹理大约发生变化 每秒 20 次 并通过传
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在 Android 中更新到 API 26 时,清单合并失败并出现多个错误

    我尝试使用 API 26 更新我的 gradle 安卓工作室2 3 3 但我在编译项目时遇到以下错误 这是我收到的错误的屏幕截图 应用级别build gradle Top level build file where you can add

随机推荐

  • 激活手电筒应用程序的 LED

    我正在尝试为我的 iPhone 制作一个手电筒应用程序 我有一部 iPhone 4 想在我的项目中使用 iPhone 上的 LED 谁能帮助我开始使用它 这是一个较短的版本 您现在可以使用它来打开或关闭 LED void torchOnOf
  • 如何从 ASP.NET Web 应用程序在特定时间发送邮件

    我是 ASP NET 新手 我有一个项目正在运行 我需要每天中午12点向不同的用户发送不同的邮件 我需要知道如何实现每天在某个时间段醒来的方法 请帮助我提供尽可能多的细节 因为我是一个完全的初学者 Use 石英网 Quartz NET 是一
  • 将 Imgur API 与 Angular4 结合使用

    我正在使用 Angular 开发一个 Web 应用程序 但在使用 Imgur API 时遇到问题 我的目标是建立一个表单 用户可以选择其照片 然后将其上传到 imgur 并将链接存储在存储图像的位置 但是 我有两个问题 存储 图像的最佳方式
  • 如何构建 mtp 设备的路径(可在文件夹浏览对话框中使用)?

    我实现了从Windows PC到Android设备的文件传输 该设备通过MTP连接到计算机 复制实现已准备就绪 我使用了这个示例 http code msdn microsoft com windowsdesktop Portable De
  • NodeJS/express:缓存和 304 状态码

    当我重新加载使用express制作的网站时 我在Safari 而不是Chrome 中得到一个空白页面 因为NodeJS服务器向我发送了304状态代码 怎么解决这个问题呢 当然 这也可能只是 Safari 的问题 但实际上它在所有其他网站上都
  • 在python中设置http响应读取方法的超时

    我正在用 python 构建一个下载管理器来娱乐 有时与服务器的连接仍然存在 但服务器不向我发送数据 因此 HTTPResponse 的 读取方法永远阻止我 例如 当我从位于我国境外的服务器下载时 就会发生这种情况 这会限制其他国家 地区的
  • 如何从命令行设置列表类型的 CMake 变量

    我正在尝试做这样的事情 cmake G Visual Studio 15 2017 Win64 DCMAKE CONFIGURATION TYPES ReleaseDebug But the CMAKE CONFIGURATION TYPE
  • 使用线程安全更新单例的属性

    我们的设置是 Asp NET MVC5 使用 AutoFac 进行 DI 我们有一个类 单例 它管理各种服务的访问令牌 有时 这些令牌即将到期 不到 10 分钟 我们会请求新令牌并刷新它们 我当前的实现如下所示 member int use
  • 将 R 中 data.frame 的每一列中的所有值相加

    给定这个数据集 Name Height Weight 1 Mary 65 110 2 John 70 200 3 Jane 64 115 我想对每个限定符列 身高和体重 求和 199 425 问题是限定符可能不止 2 个 即更多 不仅仅是身
  • JSF 为组件声明定义自定义命名空间

    当您在 JSF 页面中使用外部库 或自定义组件 中的组件时 您需要添加 xmlns 声明 例如 xmlns util http java sun com jsf composite component util 我想知道如何在 Namasp
  • 如何从视图中调用控制器 - Laravel

    我有一个列出时间表的视图 在该视图上 每个时间表都有一个可交付成果字段 我有一个 DeliverableController 它有一个操作 DropdownList 该操作调用模型并获取可交付成果列表并将它们推送到可交付成果视图 这只是创建
  • 如何给jqgrid添加Tooltip

    我正在使用 jqgrid 显示服务器中存在的数据 如何在鼠标悬停工具提示上显示数据描述 在 jqgrid 上显示工具提示的最佳方式是什么 鼠标悬停时 jqGrid 中显示的工具提示只不过是相应 HTML 元素的 标题 属性 如果您想更改工具
  • Java将字符串转换为日期然后比较

    我有一个二维字符串数组 static String TaskStorage Task 1 02 07 13 Task 2 02 08 13 Task 3 02 09 13 Task 4 02 10 13 Task 5 02 11 13 Ta
  • Python - 按索引对列表列表中的重复项进行分组

    我见过很多关于从列表中删除重复项并对其进行计数的问题 但我正在尝试找到将它们分组的最佳方法 列表列表 鉴于此示例 我想按第三个字段进行分组 1 text name1 text 2 text name2 text 3 text name2 t
  • 编译时依赖注入[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 为什么所有 DI 框架都会在应用程序启动之前检查运行时的所有依赖关系 为什么不在编译时检查这一点 这样做有什么好处呢 是否可以更改已部署应用程序中的依赖关系 例如 当应用程序启动
  • 如何在页面刷新时保持选定/活动的 HTML 链接颜色?

    EDIT 我想要保持选中状态 在页面刷新时保持 HTML 链接颜色 我尝试了其他已经得到解答但对我不起作用的问题 例如 当我单击 HTML 链接时 将 HTML 链接分类Quizzes它将把颜色更改为红色 并保持页面上的颜色刷新 HTML
  • 自定义异常类每次都显示 Unreachable catch 块

    我创建了一个自定义异常类 我想在我的应用程序中使用它 public class MyException extends Exception private static final long serialVersionUID 2151515
  • Mysql 搜索以逗号分隔的字符串

    我有 1 个名为的 mysql 表colors有行id and name 1 yellow 2 black 3 red 4 green 5 white 6 blue 例如 如果我有搜索字符串 如何获取 ID 数组 colors gt str
  • 为什么数据段和堆栈段是可执行的?

    我刚刚注意到我的简单程序的数据和堆栈段是可执行的 我在 proc pid maps 中看到它 并且简单的代码证实了这一点 例如 prog asm section data code db 0xCC int3 section text glo
  • ListView 中的 SpannableString 正则表达式

    我有一个 ListView 我使用自定义适配器将字符串集合绑定到它 我还在文本中的某些关键字下划线 我使用 SpannableString 和正则表达式来给单词加下划线 但我想知道这是否是最有效的方法 我注意到 java util rege