我正在制作一个非常简单的应用程序(基本上是一个只有几个图像的列表视图)。在我的测试设备上(一部摩托罗拉Moto G,自带安卓系统),它的表现总体上还不错。
然而,我希望我的ListView有点分隔符。因此,我制作了一个list_divider.xml文件来定义分隔符,并将其设置为在ListView中使用的分隔符。我在我的Moto G上试用过,但没有显示虚线。
所以我用谷歌搜索了一下,找到了这个问题的解决方案。为视图禁用hw加速解决了错误并正确显示分隔符。
然而,现在我有另一个问题:由于禁用了hw加速,应用程序在滚动时开始延迟。
是否有一个解决方案,有一个点分隔符,而不是禁用如何加速或至少有性能几乎一样好,因为禁用它之前?
编辑:这是我使用的适配器代码:
public class AstronautArrayAdapter extends ArrayAdapter<Astronaut> {
public static final String TAG = "AstronautArrayAdapter";
public AstronautArrayAdapter(Context context, List<Astronaut> objects) {
super(context, R.layout.astronauts_list_row, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RowViewHolder holder = null;
if (convertView == null) {
LayoutInflater inflater = ((Activity) getContext()).getLayoutInflater();
convertView = inflater.inflate(R.layout.astronauts_list_row, parent, false);
holder = new RowViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.nameOfAustronaut);
holder.daysInSpace = (TextView) convertView.findViewById(R.id.numberOfDaysInSpace);
holder.country = (ImageView) convertView.findViewById(R.id.countryImage);
holder.title = (TextView) convertView.findViewById(R.id.titleOfAstronaut);
convertView.setTag(holder);
} else {
holder = (RowViewHolder) convertView.getTag();
}
Astronaut astronaut = getItem(position);
holder.name.setText(astronaut.getName());
holder.daysInSpace.setText(Integer.toString(astronaut.getDaysInSpace()));
holder.country.setImageBitmap(astronaut.getCountryImage(getContext()));
holder.title.setText(astronaut.getTitle());
return convertView;
}
private static class RowViewHolder {
TextView name;
TextView daysInSpace;
ImageView country;
TextView title;
}
}
编辑2:下面是两个有问题的布局文件:
activity_main.xml
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/astronautsList"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="16dp"
android:dividerHeight="3dp"
android:divider="@drawable/list_divider"
android:layerType="software" />
list_divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line" >
<stroke
android:width="1px"
android:color="@android:color/black"
android:dashWidth="5px"
android:dashGap="1px" />
<size android:height="3dp" />
</shape>
您看到的延迟的可能答案是:
将dependencies
部分中的这行添加到build.gradle
compile 'com.squareup.picasso:picasso:2.3.2'
并替换这一行
holder.country.setImageBitmap(astronaut.getCountryImage(getContext()));
Picasso.with(context).load(/* insert the URL here */).into(holder.country);
并删除下载所有图像并在本地保存的代码。Picasso自动下载/解码位图,并为您管理磁盘和ram缓存。
ps:如果你不使用Gradle:
- 你应该切换到Android-Studio并使用Gradle
- 忘记我说过的在gradle文件中添加这一行,从他们的网站上下载jar文件,放到
libs
文件夹中,并确保打乱项目设置,以确保jar进入你的APK(老实说,我不记得这些设置是如何工作的,因为我很久以前就放弃了Eclipse)
正如您没有提到的,您是否实现了ViewHolder模式?
当ListView回收视图时,它必须膨胀布局并插入任何文本和图像。你通常在这段代码中调用findViewById,这是非常昂贵的。ViewHolder模式解决了这个问题,并且很容易实现。
看这里的一个伟大的教程由谷歌
http://developer.android.com/training/improving-layouts/smooth-scrolling.html