应用程序落后于android:layerType=";软件“;

应用程序落后于android:layerType=";软件“;,android,listview,hardware-acceleration,Android,Listview,Hardware Acceleration,我正在制作一个非常简单的应用程序(基本上是一个只有几张图片的列表视图)。它通常在我的测试设备上表现得非常好(一款摩托罗拉Moto G,附带股票android) 但是,我希望我的ListView有点分隔符。因此,我创建了一个list_divider.xml文件来定义分隔符,并将其设置为ListView中要使用的分隔符。我已经在我的摩托G上试过了,但它没有显示虚线 所以我搜索了一下,找到了解决问题的方法。禁用视图的硬件加速解决了错误,并正确显示了分隔符 然而,现在我有另一个问题:由于禁用硬件加速,应

我正在制作一个非常简单的应用程序(基本上是一个只有几张图片的列表视图)。它通常在我的测试设备上表现得非常好(一款摩托罗拉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:

  • 您应该切换到Android Studio并使用Gradle
  • 忘记我说过的将行添加到gradle文件中,只需从他们的文件夹下载jar文件,放入
    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);