Jedes Element in meinem ListView
enthält ein ImageView
und ein TextView
, wird dies mit Remote-Informationen gefüllt werden.Noch ein getView mehrfach aufgerufen
Ich habe eine URL für die ImageView
, daher starte ich eine AsyncTask
, die das Bild herunterlädt und setImageBitmap
mit der heruntergeladenen Bitmap aufrufen wird.
Das geht sehr gut, aber wenn die ListView erstellt wird, wird die getView()
oft aufgerufen. Es ruft etwa 7 Mal die getView
für die ersten 10 Zeilen (nur 7 sichtbar). (Also: 0, 1, usw., 10, 0, 1 usw.).
Dann kann ich einfach bis zum zehnten Element scrollen. Aber danach ruft die Listview für jede neue Zeile erneut etwa das 7-fache der getView
für die ersten 10 Elemente auf. (Dies wird Lag verursachen ..)
Aber wenn ich die setImageBitmap
aus der AsyncTask
entfernen, wird dies alles nicht passieren!
Was könnte das Problem sein? Könnte es sein, dass ein Layout zu groß ist, was zu einer weiteren Folge von getViews führt?
Hier einige Code:
<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" />
Die 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);
Mehr Informationen:
Wenn eine neue Ansicht erstellt die Stacktrace anzeigen n die getView wurde von ListView.makeAndAddView()
Aber in der nutzlosen Strähne GetViews nannte es herkommt ListView.measureHeigthOfChildren()
So scheint es, wie das Layout geändert wird, wenn ich die Bitmap gesetzt ...
ja sieht so auch ich glaube, die Eltern sollen mich dies durch that..But bewirkt bekommt als Mutter Höhe hinzukommen, was nicht daran gedacht, sicher .. –