我希望你能帮助我。 我想创建动态表(截图)。我是通过以下代码创建的:
TableLayout tl = (TableLayout) findViewById(R.id.main_table);
FOR. 1-300.........
TableRow tr_head = new TableRow(this);
tr_head.setId(10);
tr_head.setBackgroundColor(Color.CYAN);
tr_head.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
RelativeLayout rl = new RelativeLayout(this);
rl.setId(20);
ImageButton xyz = new ImageButton(this);
xyz.setId(21);
xyz.setPadding(5, 5, 5, 5);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT );
params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 20 );
rl.addView(xyz,params);
tr_head.addView(rl);
tl.addView(tr_head, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
END OF FOR.......
通过类似的代码,我很好地创建了两种类型的项目,一种用于类别(3种子视图),另一种用于类别项目(10种子视图)。 然后我使用代码bellow为按钮和整个项目分配onclick监听器。:
int count = tl.getChildCount();
for(int i = 0; i < count; i++){
TableRow v = (TableRow)tl.getChildAt(i);
if(v.getChildAt(0) instanceof RelativeLayout){
RelativeLayout relativ = (RelativeLayout)v.getChildAt(0);
if(relativ.getChildCount()>5)
relativ.setOnClickListener(new MyClickListener());
...........
但是当我想创建包含300个项目的表时,需要30秒。在模拟器上呈现此视图。这真的很慢。所以我想问你如何渲染这个视图。一些示例或教程将非常有用。
非常感谢提前。
答案 0 :(得分:7)
Android在内存中拥有多个视图非常慢。要解决这个问题,我建议使用默认的Andoird ListView和自定义ListAdapter。
当用户滚动列表时,会立即创建视图,因此只有当前可见的视图必须在内存中。
此示例使用CursorAdapter,但您也可以使用ArrayAdapter。
private class ExtendCursorAdapter extends CursorAdapter {
public ExtendCursorAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public int getItemViewType(int position) {
if (position == 0) { //Determine if it's a category or an item
return 0; // category
} else {
return 1; // item
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (getItemViewType(position) == 0) {
View v;
if (convertView != null)
v = convertView;
else
v = inflater.inflate(R.id.listcategory);
// Set title, ...
return v;
} else{
// the same for the item
}
}
}
使用convertView可以提高性能。在滚动时,您不需要创建任何其他视图,因为Android会重用那些看不见的视图。您只需确保重置convertView的所有数据。
答案 1 :(得分:1)
我遇到了类似的性能问题,除了我想要做的只是以格式化的表格形式显示文本(列自动调整大小等)。在这种情况下,您可能希望完全放弃TableLayout并使用类似java.util.Formatter的内容将文本转换为表格形状并将其提供给单个TextView。对我来说,这会带来很大的性能提升(将活动加载到几乎瞬间约为2秒)。
查看更多detials here。