ClickableSpans和使用游标的更快/更少的开销方法?

时间:2018-03-02 20:41:41

标签: android textview cursor clickablespan

我在Android应用中的数据库之间提供数据。一个数据库的信息在文本视图中显示为可点击的跨度。在创建新跨距之前,光标会重新排序所有跨距,然后将它们全部重新附加到textview。

此功能有效,但是一旦数据库有大约50行或更多行,每次数据在短时间内发生变化时迭代游标都会非常慢。

有没有办法实现一种只需要查看新行以将其添加到适当位置的方法,而不是每次创建新跨度时迭代光标中的每一行?同样,有没有办法删除跨度而无需重新加载整个textview?

为由clickableSpans组成的textview准备数据的代码:

escape_control_characters()

(注意:dbHelper.fetchAllTT3Values()函数按整数列对数据进行排序,因此这将重新排列下面函数中附加的内容。)

标记有数据的可点击跨度代码:

        Cursor cursor = dbHelper.fetchAllTT3Values();

        do {
            String value = cursor.getString(cursor.getColumnIndex("mainValues"));
            doClickSpanForString(tv1, value, cursor.getInt(3));

        } while (cursor.moveToNext());

        cursor.close();

1 个答案:

答案 0 :(得分:0)

编辑:

在使用该数据库的数据期间,我最终没有使用下面的方法,只从数据库中查询一次数据。它的速度更快,但在文本视图中添加了大约一千条数据之后,它仍然明显变慢。将大型spannablestringbuilder附加到textview或事先通过循环更新数据会导致速度变慢。我认为删除循环是唯一的解决方案。但是,如果附件是瓶颈,则不会更快地将数据附加到textview。什么是一个老的,不充分的解决方案。

    sb = new SpannableStringBuilder("");
    do {

        String value = cursor.getString(cursor.getColumnIndex("mainValues"));
        sb.append(doClickSpanForString(value, cursor.getInt(3)));

    } while (cursor.moveToNext());

    tv1.setText(sb);

将函数doClickSpanForString更改为在循环的每次迭代时都不对textView起作用,这使得此代码更有效。但它仍然很慢。