另一个getView被多次调用

我的ListView每个项目包含一个ImageView和一个TextView ,这将充满远程信息。

我得到了一个ImageView的URL,因此我启动了一个AsyncTask来下载图像,并将下载的位图调用setImageBitmap

这很好,但是当创buildListView时,经常调用getView() 。 它调用大约7倍的前10行getView (只有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" /> 

AsyncTask:

 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); 

一些更多的信息:

当创build一个新的视图时,stacktrace显示的是从ListView.makeAndAddView()调用的getView,但是在无用的getViews中,它来自ListView.measureHeigthOfChildren()

所以,当我设置位图时似乎布局被改变…

问题出在ListView的布局中。

当我把它改为fill_parent时,参数layout_width被设置为wrap_content ,问题消失了…

我build议你观看这个videohttp://www.youtube.com/watch?v=wDBM6wVEO70

基本上android会多次调用getView来计算视图高度和东西,所以你需要在你的asynchronous中实现某种caching,检查http://code.google.com/p/android-query/哪里有if你不使用authentication

问题是你的ListView不知道每个项目是什么。 初始化时,ListView将测量其所有的孩子,并根据这些信息进行绘制。 你在做什么,你的AsyncTask,正在改变列表中的项目的大小,而不是让ListView完全绘制自己。 这会导致您的ListView行为蛮横。

解决scheme:您应该通过使用AsyncTask的PostExecute中的notifyDataSetChanged()通知适配器来更新您的ListView。 这将允许ListView使用新的信息绘制自己。

我希望它的作品!

一些有用的链接:

http://thinkandroid.wordpress.com/2012/06/13/lazy-loading-images-from-urls-to-listviews/

在ListView中延迟加载图像

抱歉回复晚了。 我一直在我的适配器图库小部件面临同样的问题。 我曾经使用过Universal Image Loader。 Martijn的解决scheme为我工作。 我所要做的只是添加notifyDataSetChanged(),当图像已被完全下载和imageView被设置。

我尝试在ListView中使用fill_parent作为高度,但我无法实现它完美,但我怎么试过,通过防止创buildconvertViews,如果它已经存在。 它在我的appoach工作正常。

  @Override public View getView(final int position, View convertView, ViewGroup parent) { if (convertView != null) return convertView; else { //your code... } }