【问题标题】:Adding several strings to a layout向布局中添加多个字符串
【发布时间】:2014-05-29 01:58:26
【问题描述】:

我需要在布局中添加一些字符串,但我需要将每个字符串添加到新行(作为列表)中,并在布局超出垂直尺寸时使布局可滚动。这些字符串的数量是在运行时定义的,所以我这样做:

ScrollView scrollView = new ScrollView(context);
LinearLayout scrollViewLayout = new LinearLayout(context);
scrollViewLayout.setOrientation(LinearLayout.VERTICAL);
LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,
                                             LayoutParams.WRAP_CONTENT);
TextView tv2;

for(int i = 0; i < count; i++) { //count is defined at runtime when the
                                 //array strings[] is created
                                 //and defines the amount of array's values
    tv2 = new TextView(context);
    tv2.setLayoutParams(layoutParams);
    tv2.setText(strings[i]);
    scrollViewLayout.addView(tv2);
}

scrollView.addView(scrollViewLayout);

但我不认为在循环中实例化对象并添加这样的字符串是可以接受的,此外,由于 ScrollView 对象,我收到日志消息“GC_FOR_ALLOC...”和“Grow heap...”所以我认为我应该以另一种更合适的方式执行此操作。请解释我如何正确地将字符串添加到布局并使其可滚动。提前致谢!

【问题讨论】:

    标签: android list layout textview scrollview


    【解决方案1】:

    你为什么不能一次又一次地使用同一个TextView?

    例如:

    tv2.setText(tv2.getText() + *newline* + msg);
    

    在你的情况下:

    for(String str : strings)
    {
         tv2.setText(tv2.getText() + *newline* + str);
    }
    

    【讨论】:

    • 好吧,我只是认为多次使用相同的TextView 对象会导致错误或者不可接受。所以你说我的代码很好?但也许还有办法避免使用ScrollView?因为如果实例化它我会得到这些错误......
    • 您所说的错误是指“GC_FOR_ALLOC”吗?这些不是错误,只是意味着它需要更多内存。
    • 但它说它分配了大约 12 MB 的内存。一个只添加 15 行文本的动作是不是太过分了?
    • 如果你想能够滚动,你需要使用scrollview。好吧,可以使用 Listview,因为它也是一个滚动视图,但为什么要让它变得复杂。我的代码是最简单的。你甚至不需要线性布局。只需将 textview 放入 scrollview 即可。
    • 先试试我的代码并进行比较。拥有 1 个文本视图比拥有 15 个文本视图要好得多。
    【解决方案2】:

    为什么不只使用一个TextView 并在每次循环迭代中附加文本。类似的东西

    TextView tv2;
    tv2 = new TextView(context);
    tv2.setLayoutParams(layoutParams);
    for(int i = 0; i < count; i++) { //count is defined at runtime when the
                                 //array strings[] is created
                                 //and defines the amount of array's values
        if (i > 0)
            tv2.append(" \n" + strings[i]);
        else
            tv2.setText(strings[i]);
    }
    scrollView.addView(scrollViewLayout);
    

    【讨论】:

    • 不应该是\n而不是/n吗?
    • 好吧,我只是认为多次使用相同的TextView 对象会导致错误或者不可接受。所以你说我的代码很好?但也许还有办法避免使用ScrollView?因为如果实例化它我会得到这些错误......
    • 你没有说任何关于错误的事情。不,我认为 ScrollView 很好,但我向您展示的方式只会实例化一个 TextView 一次。您所做的只是在每次循环中添加一个换行符和新文本。
    • 不,你不会得到错误。但是使用一个 TextView 可能会更适合您正在做的事情。试试这个
    • 它必须分配更多内存,因为您正在创建多个TextViews
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    相关资源
    最近更新 更多