我正在创建一个非常简单的应用程序(基本上只有一些图像的列表视图)。它通常在我的测试设备上表现得非常好(摩托罗拉Moto G带有它附带的股票机器人)。
但是,我希望我的ListView有点分隔符。因此,我创建了一个list_divider.xml文件来定义分隔符,并将其设置为ListView中使用的分隔符。我已经在我的Moto G上试过了,但它没有显示点缀的线条。
所以我用谷歌搜索了here解决问题的方法。禁用视图的hw加速解决了错误并正确显示了分隔符。
然而,现在我还有另一个问题:自从禁用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>
答案 0 :(得分:1)
您可以看到的滞后可能的答案是:
将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:
libs
文件夹并确保弄乱项目设置以确保那个jar进入你的APK(老实说我不记得这些设置是如何工作的,因为我很久以前就放弃了Eclipse)答案 1 :(得分:0)
正如您没有提到的那样,您是否实现了ViewHolder模式?
当ListView回收视图时,它必须给布局充气并插入任何文本和图像。通常在这部分代码中调用findViewById非常昂贵。 ViewHolder模式解决了这个问题,并且易于实现。
请点击此处查看Google的精彩教程
http://developer.android.com/training/improving-layouts/smooth-scrolling.html