0

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

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

有没有办法实现一种方法,只需要查看新行即可将其添加到适当的位置,而不是每次创建新跨度时都遍历游标中的每一行?同样,有没有办法删除跨度而不必重新加载整个文本视图?

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

        Cursor cursor = dbHelper.fetchAllTT3Values();

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

        } while (cursor.moveToNext());

        cursor.close();

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

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

public void doClickSpanForString(TextView txtSpan, String valtag, Integer valordtag) {
        spanText = new SpannableString(valtag+" ");
        MyClickableSpan a = new MyClickableSpan(valtag);
        a.setTag1(valtag);
        a.setTag2(valordtag);
        spanText.setSpan(a, 0, valtag.length(), 0);
        txtSpan.append(spanText);

    }

private class MyClickableSpan extends ClickableSpan {

        private String mtag1;
        private int mtag2;

        void setTag1(String tag) {
            mtag1 = tag;
        }
        String getTag1() {
            return mtag1;
        }
        void setTag2(Integer tag) {
            mtag2 = tag;
        }
        int getTag2() {
            return mtag2;
        }

        MyClickableSpan(String string) {
            super();
        }
        public void onClick(View tv) {
            //tv.performLongClick();


            setstr4val(getTag1());
            setint4valord(getTag2());

        }
}
4

1 回答 1

0

编辑:

我最终没有使用下面的方法,在使用该数据库的数据期间只从数据库中查询一次数据。它的速度更快,但是在将大约一千条数据添加到 textview 之后,它仍然很慢。将大型 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 使得这段代码更加高效。但它仍然很慢。

于 2018-03-04T19:08:43.823 回答