我的Android应用程序有一个非常奇怪的问题.简单地说,当我将图像内容放入ListView项时会出现问题.
例如;假设我有一个具有以下布局的片段;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@android:id/list" />
</LinearLayout>
以及我的’列表项’的以下布局;
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp">
<ImageView
android:layout_width="@dimen/list_image_width"
android:layout_height="@dimen/list_image_height"
android:id="@+id/listimage"
android:scaleType="centerCrop" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listtitle"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/listimage"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:textSize="18sp"
android:textColor="#000" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listsubtitle"
android:layout_below="@+id/listtitle"
android:layout_alignRight="@+id/listtitle"
android:layout_alignEnd="@+id/listtitle"
android:textSize="17sp"
android:textColor="#333"
android:layout_alignBottom="@+id/listimage"
android:layout_alignLeft="@+id/listtitle"
android:layout_alignStart="@+id/listtitle" />
</RelativeLayout>
一切顺利.该列表就像我想要的那样呈现出来.但是,每当我开始将图像(内容)放入ImageView时,事情就会变得混乱.无论我做什么,列表加载速度非常慢,滚动几乎是不可能的.
我尝试了多种加载图像并将它们放入ImageView的方法.
我试过的事情:
>在自定义适配器中使用ViewHolder,从Drawables文件夹中加载AsyncTask中的Images并将它们放入.onPostExecute()上的ImageView中
>在自定义适配器中使用ViewHolder,从Drawables加载图像而不使用AsyncTask.
>使用EasyAdapter,通过加载onSetValues()上的Drawables中的图像.
>使用EasyAdapter,通过加载`onSetValues()上的Assets文件夹中的图像
所有这些并没有真正做出任何不同,但最后的选择.最后一个选项使列表更容易接受,但仍然加载速度非常慢. (我按下按钮,片段被启动,我尝试使用TransactionManager打开它,这似乎只是在显示列表之前冻结应用程序约2-5秒.)滚动也是可以接受的,但仍然不是它可以而且应该是好的.
如果我注释掉我将Image设置到ImageView中的部分并再次运行它,那么视图绝对没有任何问题.
这一切归结为,设置Drawables文件夹中的内容是不行的. (虽然我已经为我构建的每个应用程序都做了这个没有问题).从Assets文件夹设置图像内容可以极大地提高性能,但仍然没有达到我期望的性能.即使使用EasyAdapter如下,也会给出一个可怕的用户体验:
@LayoutId(R.layout.list_default)
public class ListAdapter extends ItemViewHolder<Item> {
@ViewId(R.id.listimage)
ImageView image;
@ViewId(R.id.listtitle)
TextView title;
@ViewId(R.id.listsubtitle)
TextView subtitle;
public BeetListAdapter(View view) {
super(view);
}
@Override
public void onSetValues(BeetItem item, PositionInfo positionInfo) {
title.setText(item.getTitle());
subtitle.setText(item.getLatinname());
image.setImageBitmap(getBitmapFromAsset(item.getFirstImageName()));
getView().setTag(R.id.itemid, item.getId());
}
private Bitmap getBitmapFromAsset(String strName)
{
AssetManager assetManager = getContext().getAssets();
InputStream istr = null;
try {
istr = assetManager.open("images/" + strName + ".jpg");
} catch (IOException e) {
e.printStackTrace();
}
Bitmap bitmap = BitmapFactory.decodeStream(istr);
return bitmap;
}
}
你们有任何想法为什么会这样吗?我找不到任何理由,也没有找到解决方法.
提前致谢!
tl; dr:当我将图像放入ImageView时,我的ListView非常慢.它们来自何方和地点似乎并不重要(ram,disk,internet).每当我执行imageView.setImageBitmap()或imageView.setDrawable()时,性能下降和滚动几乎是不可能的.
解决方法:
如果可能,请缓存图像,将其缩小. Aquery library可以帮助您完成所有这些任务.