我正在使用ListView
列表项具有背景资源的位置。我想尽可能多地摆脱透支。我知道 Romain Guy 博客上的性能案例研究帖子,但我无法完全优化列表视图。本文底部显示了一个简化示例的代码。该示例基本上只是带有列表视图的“新活动”向导。我的问题建立在这个示例之上。这是初始未优化案例的带有和不带有过度绘制标记的屏幕截图:
见证页面有灰色背景(它是我真实项目中的纹理)并且列表项有白色背景(它是我真实项目中的九个补丁)。过度绘制是戏剧性的,屏幕的任何部分都不会只绘制一次,列表项在显示内容字母之前被绘制三次。
很容易摆脱装饰视图中的背景,Window
并切出一个完整的透支层。如果列表包含足够的项目来填满整个屏幕,我也可以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" />