应用程序落后于android:layerType=";软件“;
我正在制作一个非常简单的应用程序(基本上是一个只有几张图片的列表视图)。它通常在我的测试设备上表现得非常好(一款摩托罗拉Moto G,附带股票android) 但是,我希望我的ListView有点分隔符。因此,我创建了一个list_divider.xml文件来定义分隔符,并将其设置为ListView中要使用的分隔符。我已经在我的摩托G上试过了,但它没有显示虚线 所以我搜索了一下,找到了解决问题的方法。禁用视图的硬件加速解决了错误,并正确显示了分隔符 然而,现在我有另一个问题:由于禁用硬件加速,应用程序在滚动时开始延迟 有没有一种解决方案可以使用虚线分隔器而不禁用硬件加速,或者至少性能几乎与禁用它之前一样好 编辑:以下是我使用的适配器代码:应用程序落后于android:layerType=";软件“;,android,listview,hardware-acceleration,Android,Listview,Hardware Acceleration,我正在制作一个非常简单的应用程序(基本上是一个只有几张图片的列表视图)。它通常在我的测试设备上表现得非常好(一款摩托罗拉Moto G,附带股票android) 但是,我希望我的ListView有点分隔符。因此,我创建了一个list_divider.xml文件来定义分隔符,并将其设置为ListView中要使用的分隔符。我已经在我的摩托G上试过了,但它没有显示虚线 所以我搜索了一下,找到了解决问题的方法。禁用视图的硬件加速解决了错误,并正确显示了分隔符 然而,现在我有另一个问题:由于禁用硬件加速,应
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;
}
}
公共类ArrayAdapter扩展了ArrayAdapter{
public static final String TAG=“宇航员阵列自适应”;
公共ArrayAdapter(上下文、列表对象){
超级(上下文、右布局、列表、对象);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
RowViewHolder=null;
if(convertView==null){
LayoutInflater充气器=((活动)getContext()).getLayoutInflater();
convertView=充气机。充气(R.layout.row\u list\u行,父项,false);
holder=新的行VIEWHOLDER();
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=(RowViewHolder)convertView.getTag();
}
宇航员=获取项目(位置);
holder.name.setText(automotor.getName());
holder.daysInSpace.setText(Integer.toString(audion.getDaysInSpace());
holder.country.setImageBitmap(automotor.getCountryImage(getContext());
holder.title.setText(宇航员.getTitle());
返回视图;
}
私有静态类RowViewHolder{
文本视图名称;
文本视图空间;
图像视图国家;
文本视图标题;
}
}
编辑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>
由于您没有提到,您是否实现了ViewHolder模式 当ListView回收视图时,它必须膨胀布局并在其中插入任何文本和图像。在这段代码中,您通常调用findviewbyd,这相当昂贵。ViewHolder模式解决了这一问题,并且易于实现 请参见此处,获取谷歌提供的精彩教程
对于您所看到的滞后现象,可能的答案是: 将这一行添加到build.gradle的
依赖项
部分中
compile 'com.squareup.picasso:picasso:2.3.2'
然后换掉这条线
holder.country.setImageBitmap(astronaut.getCountryImage(getContext()));
与
并删除正在下载所有图像并在本地保存的代码。毕加索自动下载/解码位图,并为您管理磁盘和ram缓存
ps.:
如果您没有使用Gradle:
libs
文件夹,确保项目设置混乱,以确保jar进入APK(我真的不记得这些设置是如何工作的,因为我很久以前就放弃了Eclipse)是的,我确实使用了ViewHolder,但它仍然滞后。请将内部类设置为static(您不需要private,但其他情况下代码看起来不错,可能需要布局文件才能确保。我将添加它,请稍候;)好的,在看到其他的注释之后,抓取这个名为毕加索的库,它非常简单,并且能够很好地处理图像加载这一行:
holder.country.setImageBitmap(audion.getCountryImage(getContext())代码>让它看起来像你可能在UI线程上进行位图解码(甚至下载)。是吗?不是。在应用程序开始时,我下载所有我想要的东西并保存在本地。(应用程序在启动时确实会延迟,但我知道这是因为下载量太大,需要它)。“本地保存”这仍然意味着在该行调用期间,位图会从磁盘读取(I/O操作)和解码(CPU密集型操作)。我会把我的建议写在一个答案中。回复2:把它放在libs
中,ADT会为你做的,幸运的是谷歌没有放弃那么多ADT
Picasso.with(context).load(/* insert the URL here */).into(holder.country);