gpt4 book ai didi

android - ListView 中的 SpannableString 正则表达式

转载 作者:行者123 更新时间:2023-11-29 18:16:27 24 4
gpt4 key购买 nike

我有一个 ListView,我使用自定义适配器将字符串集合绑定(bind)到该 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;
}
}

最佳答案

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

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

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

关于android - ListView 中的 SpannableString 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com