Hoi Leute,
ich bastel grad an nem neuen Projekt rum und bin auf die GridView gestoßen, die ich irgendwie nicht ganz verstehe.
Habe mir eine eigene Klasse gebastelt, die von GridView erbt und im Konstruktor eine innere Klasse, die von BaseAdapter erbt dran gesteckt. Die GridView bekommt eine ArrayList mit Bildnamen in Form von Strings, gibt das ganze an den Adapter durch und der bastelt in der getView dann eine ImageView draus.
Das ganze funktioniert an sich auch recht gut, jedoch will ich ein Grid haben, das 3 Columns und beliebig viele Rows hat. Deshalb habe ich mittels this.setNumColumns(3); die Columns auf 3 beschränkt. Nur werden jetzt insgesamt nur 3 angezeigt und er bricht nicht um.
Die Beispiele die man so im Netz findet sind etwas unklar, z.B. hier. Das Bild oben lässt in meinen Augen drauf schließen, dass der Code drunter was Mehrzeiliges generiert, ein Grid eben und nicht nur eine einzige Zeile.
Hat jemand eine Idee bzw. Erklärung, wieso das nicht so klappt wie ich will?
Hier mein bisheriger Code
public class GalleryGrid extends GridView {
private Context context;
private ArrayList<String> images;
private GalleryGridAdapter adapter;
public GalleryGrid(Context context) {
super(context);
this.context = context;
this.setNumColumns(3);
adapter = new GalleryGridAdapter();
this.setAdapter(adapter);
}
public void setImages(ArrayList<String> images) {
this.images = images;
buildView();
}
private void buildView() {
for (int i = 0; i < images.size(); i++) {
ImageView iv = new ImageView(context);
iv.setImageBitmap(Tools.getBitmapFromAsset(context, images.get(i), true));
adapter.addImage(iv);
}
}
private class GalleryGridAdapter extends BaseAdapter {
private ArrayList<ImageView> images = new ArrayList<ImageView>();
@Override
public int getCount() {
return this.images.size();
}
@Override
public Object getItem(int position) {
return this.images.get(position);
}
@Override
public long getItemId(int position) {
return this.images.get(position).getId();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iv;
if (convertView == null) {
iv = new ImageView(context);
iv.setImageBitmap(Tools.getBitmapFromAsset(context, GalleryGrid.this.images.get(position), true));
iv.setAdjustViewBounds(true);
iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
iv.setPadding(3, 3, 3, 3);
MainActivity.GalleryListener listener = ((MainActivity) context). new GalleryListener(GalleryGrid.this.images, position);
iv.setOnClickListener(listener);
} else {
iv = (ImageView) convertView;
}
return iv;
}
public void addImage(ImageView image) {
this.images.add(image);
}
}
}
Alles anzeigen
(von der Variable "images" nicht verwirren lassen, die wird noch überdeckt, könnt ich mal Ändern. Um an den Listener zu kommen verränk ich mich auch noch etwas zu sehr, aber das ist jetzt erstmal egal)
Gruß,
matze
UPDATE:
Ok ... das GridView kann es ganz offensichtlich nicht leiden, wenn es in einem LinearLayout steckt. Mal schaun was sich da machen lässt.
UPDATE 2:
Hab das Problem mit folgendem Code umgangen:
Display display = ((MainActivity) context).getWindowManager().getDefaultDisplay();
int width = display.getWidth() - 40;
int rows = (images.size() / 3) + 1;
if (images.size() % 3 == 0) {
rows--;
}
int height = (width / 3) * rows;
this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, height));
Alles anzeigen
die -40 weil ich drum rum ein Padding hab, das / 3 weil mein Grid drei Spalten hat.
Irgendwie doof, dass die GridView sich vom LinearLayout so unterbuttern lässt ...