【发布时间】:2012-06-25 08:42:35
【问题描述】:
我的ListView 中的每个项目都包含一个ImageView 和一个TextView,这将填充远程信息。
我获得了ImageView 的 URL,因此我启动了一个 AsyncTask,它会下载图像并使用下载的位图调用 setImageBitmap。
这很顺利,但是当创建 ListView 时,getView() 经常被调用。
它调用前 10 行的 getView 大约 7 倍(只有 7 行可见)。 (所以:0、1 等,10、0、1 等)。
然后我可以顺利滚动到第 10 项。但在那之后,对于每个新行,listview 再次调用前 10 个项目的 getView 大约 7 倍。 (这会导致延迟..)
但是当我从AsyncTask 中删除setImageBitmap 时,这一切都不会发生!
可能是什么问题?会不会是某个布局太大,会导致 getViews 又一连串?
这里有一些代码:
<ListView
android:id="@+id/mylist"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentBottom="true"
android:layout_below="@+id/mydivider"
android:divider="@+color/mycolor"
android:dividerHeight="2dp"
android:fadingEdge="none"
android:fastScrollEnabled="true"
android:listSelector="@android:color/transparent"
android:scrollbars="horizontal"
android:scrollingCache="false"
android:smoothScrollbar="false" />
异步任务:
public static class MyTask extends AsyncTask<String, Integer, Bitmap> {
private LruCache<String, Bitmap> mMap;
private String mUri;
private int mPosition;
private ViewHolder mHolder;
public MyTask (ViewHolder holder, int position, LruCache<String, Bitmap> map) {
mMap = map;
mHolder = holder;
mPosition = position;
}
@Override
protected Bitmap doInBackground(String... url) {
mUri = url[0];
return getBitmapFromURL(mUri);
}
@Override
protected void onPostExecute(Bitmap b) {
if (b != null) {
mMap.put(mUri, b);
if (mPosition == mHolder.position) {
holder.image.setImageBitmap(b);
}
}
};
}
getView()
row = convertView;
ViewHolder holder;
if (row == null) {
row = vi.inflate(R.layout.mylayout, null);
holder = new ViewHolder();
holder.image = (ImageView) row.findViewById(R.id.myimage);
holder.title = (TextView) row.findViewById(R.id.mytext);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
holder.title.setText("text");
holder.image.setImageResource(R.drawable.mydefaulticon);
holder.position = position;
startMyTask(content, holder, position);
更多信息:
创建新视图时,堆栈跟踪显示 getView 是从 ListView.makeAndAddView() 调用的
但在 getViews 的无用连胜中,它来自ListView.measureHeigthOfChildren()
所以当我设置位图时,布局似乎发生了变化......
【问题讨论】:
-
是的,看起来如此,即使我认为父级应该在添加图像时自行重新布局,因为父级高度也会受到影响..但这是我认为不确定的..