我有动态的和相当大的内容,需要填充在用户交互(点击下一页/上一页)。
在MyTableLayout上以编程方式显示的动态内容(请参见下面的XML)。每次用户单击Next/Prev
然后我调用myTableLayout.removeAllViews()
,做一些事情并用myTableLayout.addView()
重新填充。
在小内容上,它画得很快,但我注意到,如果填充大内容,会有2到3秒的延迟。
我已经看到了一个与我的应用程序功能相同的应用程序(也有相当大的内容),但是它的分页速度非常快
即使是在低端设备上。
需要一些关于如何提高布局性能的建议。
谢谢。
注意:上面的tablelayout用作标题(header),下面的linearlayout是放置内容的位置。
<TableLayout
android:layout_width="fill_parent"
android:layout_height="45dip"
android:stretchColumns="0,2"
android:shrinkColumns="0,2"
>
<TableRow>
<LinearLayout
android:id="@+id/llLeft"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/tvLeft1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/llCenter"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/tvCenter1"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
<TextView
android:id="@+id/tvCenter2"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/llRight"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/tvRight1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
</TableRow>
</TableLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<com.MyScrollView
android:id="@+id/myScrollView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TableLayout
android:id="@+id/**myTableLayout**"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:shrinkColumns="1"
android:stretchColumns="1"
/>
</com.MyScrollView>
</LinearLayout>
下面是创建动态内容的代码。从内存中获取的内容(arraylist),因此不应该是问题所在。
private void gotoPage() {
myTableLayout.removeAllViews();
GlobalVar g = GlobalVar.getInstance();
ArrayList<String> arrScripts = g.getDatasMap().get(SCRIPT_INDEX);
ArrayList<String> arrTrans = g.getTranslationMap().get(SCRIPT_INDEX);
Log.i(APP_NAME, "finished preparing data");
try {
// Data Title
tvCenter1.setText(arrScripts.get(0));
tvCenter2.setText(" (" + SCRIPT_INDEX + ")");
int countScripts = arrScripts.size();
for(int i=1; i<countScripts; i++) {
// Row Script
TableRow trScript = new TableRow(this);
trScript.setPadding(0, 5, 0, 0);
TextView tvIndex = new TextView(this);
tvIndex.setGravity(Gravity.CENTER);
tvIndex.setWidth(40);
tvIndex.setText("" + i);
TextView tvScript = new TextView(this);
tvScript.setGravity(Gravity.RIGHT);
tvScript.setTypeface(g.getFontTypeFace());
tvScript.setTextSize(FONT_SIZE);
tvScript.setPadding(0, 0, 5, 0);
tvScript.setText(arrScripts.get(i));
trScript.addView(tvIndex);
trScript.addView(tvScript);
TableRow trTrans = null;
if(IS_USE_TRANSLATION) {
// Row Translation
trTrans = new TableRow(this);
TextView tvBlank = new TextView(this);
tvBlank.setPadding(0, 0, 0, 5);
TextView tvTrans = new TextView(this);
tvTrans.setPadding(0, 0, 0, 5);
tvTrans.setText(arrTrans.get(i));
trTrans.addView(tvBlank);
trTrans.addView(tvTrans);
}
// Place for line separator
View vSep = new View(this);
ViewGroup.LayoutParams p = new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
p.height = 3;
vSep.setLayoutParams(p);
// Combine rows to table
if(IS_USE_SCRIPT) myTableLayout.addView(trScript);
if(IS_USE_TRANSLATION) myTableLayout.addView(trTrans);
myTableLayout.addView(vSep);
}
} catch (Exception e) {
Log.e(APP_NAME, e.getMessage());
}
}
这是traceview result。
最佳答案
我同意@Amplify91的说法,它可能是从生成内容开始的,但您可能还需要注意的一点是您使用的布局数量。基本思想是“越少越好”。你可以查看一些googlelayout tricks
示例:我看到您的标题是atable
withlinearlayout
s withtextview
s。难道不能用aRelative layout
withtextviews
作为孩子来修复吗?
您将在布局树中保存一些视图和一些“深度”。
关于android - 如何提高版面表现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5062275/