GridView-scrolling-problem auf Android
diese muss somethng ganz einfach ich bin mit Blick auf, aber ich habe Folgendes problem (der Beitrag ist ziemlich lang, aber ich will so viel Infos wie möglich 🙂 ).
Ich habe ein gridview in meine Android-Anwendung, wo jede Zelle enthält benutzerdefinierte Ansicht:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<GridView
android:id = "@+id/photosGridView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:drawSelectorOnTop="true"
android:focusable="true"
android:focusableInTouchMode="true"
android:numColumns="6"
android:columnWidth="90dp"
android:verticalSpacing="5dp"
android:horizontalSpacing="5dp"
android:stretchMode="columnWidth"
>
</GridView>
</RelativeLayout>
und jede Zelle ist
<?xml version="1.0" encoding="utf-8"?>
<com.myapp.widgets.ImageThumbView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background = "@android:color/transparent"
android:paddingLeft = "1dip"
android:paddingRight = "1dip"
android:paddingTop = "2dip"
android:paddingBottom = "2dip"
>
<ImageView
android:id="@+id/thumbImage"
android:layout_width="fill_parent"
android:layout_height = "fill_parent"
android:src="@drawable/icon_small"
/>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height = "fill_parent"
android:background = "@android:color/transparent"
>
<ImageView
android:id="@+id/iconRight"
android:layout_width="40px"
android:layout_height = "40px"
android:src="@drawable/album_check"
android:visibility="gone"
android:layout_alignParentTop = "true"
android:layout_alignParentRight = "true"
/>
<ImageView
android:id="@+id/iconLeft"
android:src="@drawable/album_check"
android:visibility="gone"
android:layout_width = "40px"
android:layout_height="40px"
android:layout_alignParentTop = "true"
android:layout_alignParentLeft = "true"
/>
</RelativeLayout>
</com.myapp.widgets.ImageThumbView>
Mein adapter sieht so aus:
public class ImageAdapter extends BaseAdapter {
private List<String> mPictures = null;
public ImageAdapter(List<String> pictures) {
mPictures = pictures;
}
public int getCount() {
return mPictures != null ? mPictures.size() : 0;
}
public Object getItem(int position) {
return mPictures != null ? mPictures.get(position) : null;
}
public long getItemId(int position) {
return mPictures != null ? position : -1;
}
@Override
public View getView(int position,View convertView,ViewGroup parent)
{
ImageThumbView i = null;
try
{
Thread.sleep(100);
if (convertView == null)
{
String path = mPictures.get(position);
Log.d(((Integer)position).toString(), path);
i = addSingleView(_li, path);
TextView idx = (TextView) i.findViewById(R.id.caption);
if (idx != null)
idx.setText(((Integer)position).toString());
}
else
{
Log.d(((Integer)position).toString(), "ALREADY NOT NULL");
i = (ImageThumbView) convertView;
//These 2 lines were added only in desperate attempt to get it working, but it makes no difference
String path = mPictures.get(position);
i.updateView(path);
}
}
catch(InterruptedException ie)
{
ie.printStackTrace();
}
return i;
}
}
Also zunächst, es funktioniert einwandfrei, dh es zeigt die ersten 18 Bilder und nur wenige Pixel aus der nächsten Zeile. Aber wenn ich start einen Bildlauf durch die gridvew, die Bilder beginnen zu erscheinen nach dem Zufallsprinzip, sprich nach dem letzten Bild sehe ich einige von Anfang an und so weiter. Aus Neugier, habe ich versucht einige Beispiele wie diese: http://androidsamples.blogspot.com/2009/06/how-to-display-thumbnails-of-images.html
...und sehen das gleiche Ergebnis.
So, mache ich etwas falsch? warum auf der Erde würde GridView anzeigen mehr Elemente enthält, als es tun soll? und warum Elemente an der falschen Position?
BR,
Alex
- Kasse diesem link [stackoverflow.com/questions/11245620/... [1]: stackoverflow.com/questions/11245620/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich das problem hier ist, dass Sie den Inhalt der "convertView" innerhalb des if-oder else. Oder sollte man immer tun, dass nach der Instanziierung der Ansicht, wenn es null ist, und legen Sie nur den Inhalt, bevor Sie den Blick.
Folglich bist du sicher, dass der Inhalt der anzeigen ist immer der richtige, aktualisiert mit der position und nicht eine falsche recycelt anzeigen.
Also Ihrem sollte generell Folgendes tun:
(basierend auf dem tutorial von Android-Guide hier)
Die Antwort ist recycling.
Im Allgemeinen Ihre getView sollte immer etwas von der form:
Wo Ihr
ViewHolder
- Klasse würde so AussehenDann solltest du keine Probleme haben. Auch ich bin nicht sicher, warum Sie dringend Schlaf in Ihrem getView? Das wird langsam nach unten scrollen Ihrer GridView.
Verwenden Sie die standard-Lazy Loader, um die Bilder, aber nie update onpostexecute, die bewirkt, dass die Bilder zu aktualisieren, zu schnell und Holen Sie sich die Zufälligkeit, die Sie gar nicht wünschen.
Ich selbst verwendet den code:
int das onpostexecute-das würde dann aktualisieren Sie die Bilder richtig für den ersten Bildschirm, aber wenn Sie schleudern soll der Bildschirm Bilder kommen dann zu schnell zurück zu dem ersten Bildschirm erhalten Sie die Zufälligkeit wieder, so dass ich jetzt verwenden :
um die Ansicht zu aktualisieren.
Ich bin mit dem gleichen problem.
Ich bin in die Richtung Rendern Ansichten in den hintergrund;
Studiere ich diese codes, falls helfen sollte:
http://blog.tomgibara.com/post/7665158012/android-adapter-view-rendering
https://github.com/desertjim/LazyLoadingGridView
Jungs dieses problem zu vermeiden, immer wieder neu erstellte Objekt in der getView()