【发布时间】:2013-03-15 14:10:51
【问题描述】:
我正在使用ListView,其中列表项具有背景资源。我想尽可能多地摆脱透支。我知道 Romain Guy 博客上的 Performance Case Study 帖子,但我无法完全优化列表视图。本文底部显示了一个简化示例的代码。该示例基本上只是带有列表视图的“新活动”向导。我的问题建立在此示例之上。这是初始未优化案例的带有和不带有过度绘制标记的屏幕截图:
见证页面有灰色背景(在我的真实项目中是纹理),列表项有白色背景(在我的真实项目中是九个补丁)。过度绘制是戏剧性的,屏幕的任何部分都不会只绘制一次,列表项在显示内容字母之前会绘制三次。
很容易去掉Window中的decor view背景,剪掉一个完整的overdraw层。如果列表包含足够的项目来填满整个屏幕,我也可以删除ListView 的背景,以便找到一个非常好的地方:
不幸的是,当列表中的项目少于填满整个屏幕时,这不起作用。如果我没有设置任何背景,则列表项下方没有任何内容。如果我在列表视图(或任何父视图)上设置背景,我会为所有确实存在的列表项完全透支:
这是较小的邪恶,但令人不满意,因为大多数时候我的列表会从屏幕上消失。有没有一种可靠的方法可以在最后一项之后在列表视图中获取背景,而不会引入过度绘制?
本题使用的示例代码:
活动:
//MainActivity.java
public class MainActivity extends Activity {
private static final String[] DATA = { "Alpha", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliet" };
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Optimization 1: getWindow().setBackgroundDrawableResource(android.R.color.transparent);
ListView lv = (ListView) findViewById(android.R.id.list);
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.activity_main__list_item,
android.R.id.text1, data));
}
}
布局:
<!-- layout/activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#FFDDDDDD"
android:text="Page header information" />
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#FFDDDDDD"
android:divider="@null" />
</LinearLayout>
<!-- layout/activity_main__list_item.xml -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@android:color/white" />
【问题讨论】:
标签: android listview optimization