Еще один getView вызывается несколько раз
Каждый предмет в моемListView
содержатьImageView
иTextView
, это будет заполнено удаленной информацией.
Я получил URL дляImageView
Поэтому я начинаюAsyncTask
который загружает изображение и позвонитsetImageBitmap
с загруженным растровым изображением.
Это идет очень хорошо, но когда ListView создан,getView()
призван часто.
Это вызывает около 7 разgetView
для первых 10 строк (видны только 7). (Итак: 0, 1 и т. Д., 10, 0, 1 и т. Д.).
Тогда я могу просто плавно перейти к 10-му пункту. Но после этого для каждой новой строки просмотр списка повторяется примерно в 7 разgetView
за первые 10 предметов. (Это приведет к отставанию ..)
Но когда я удаляюsetImageBitmap
отAsyncTask
это все не произойдет!
В чем может быть проблема? Может быть, какой-то макет слишком большой, что вызовет еще одну серию 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);
Еще немного информации:
Когда создается новое представление, показанная стековая трасса вызывает getView изListView.makeAndAddView()
Но в бесполезной полосе getViews это исходит отListView.measureHeigthOfChildren()
Таким образом, кажется, что макет меняется, когда я устанавливаю растровое изображение ...