# Bitmap Array im Spinner übergeben?



## bruce85 (6. Nov 2012)

Hallo,
ich habe folgendes Problem und zwar, versuche ich ein erstelltes Bitmap in Spinner anzuzeigen, leider weiss ich nicht so genau, wie ich das machen könnte.

Hier mal mein Code:

```
final Spinner spinner = new Spinner(MenuActivity.this);
String[] text = new String[stufeAnzahl];
Bitmap[] bitmap = new Bitmap[stufeAnzahl];
for (int i=0; i<stufeAnzahl; i++) {
    	text[i] = stufe[i].typ;
    	bitmap[i] = Bitmap.createBitmap((stufe[i].feldXAnzahl*2)+(stufe[i].feldXAnzahl-1), (stufe[i].feldYAnzahl*2)+(stufe[i].feldYAnzahl-1), Bitmap.Config.ARGB_8888);
    	for (int y=0; y<stufe[i].feldYAnzahl; y++) {
    		for (int x=0; x<stufe[i].feldXAnzahl; x++) {
    			if (stufe[i].map[0].spielfeld[x][y].typeNr > 0) {
    				bitmap[i].setPixel((x*3), (y*3), Color.BLACK);
    				bitmap[i].setPixel((x*3)+1, (y*3), Color.BLACK);
    				bitmap[i].setPixel((x*3), (y*3)+1, Color.BLACK);
    				bitmap[i].setPixel((x*3)+1, (y*3)+1, Color.BLACK);
    			}
	    	}
    	}
}
//Test...
canvas.drawBitmap(bitmap[0], 20, 20, null);
```

Ich habe 2 Arrays, einmal text für den Titel und einmal bitmap für die Bilder.
Diese Arrays möchte ich jetzt im Spinner anzeigen lassen.

Hier mal ein beispiel von mir:

```
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MenuActivity.this, R.layout.row, R.id.text, text);
spinner.setAdapter(adapter);
```

Dazu habe ich ein XML Dokument namens row erstellt für den Spinner, diese enthält ein ImageView und ein TextView, die ich dann im ArrayAdapter übergeben hab.

Jetzt meine Frage:
Wie kann ich im ArrayAdapter den Array bitmap auch mit übergeben?

Ich bedanke mich schonmal im Voraus.

MfG


----------



## Tomate_Salat (6. Nov 2012)

Beim Spinner habe ich das noch nicht versucht, aber ich denke es ist ähnlich wie bei ListViews. Und dort würde ich in diesem Fall anstatt eines ArrayAdapters einen SimpleAdapter nutzen.

Hier noch ein Beispiel, wie man diesen (in einer ListView) verwendet:
Android ListView and ListActivity - Tutorial


----------



## mjdv (6. Nov 2012)

Hey,

Du musst eine Unterklasse von ArrayAdapter bilden und dann die Methode getView überschreiben. Siehe auch hier: Android ListView and ListActivity - Tutorial


----------



## schlingel (6. Nov 2012)

Bitte nicht von ArrayAdapter. Den Fehler habe ich auch als Anfänger gemacht. Da schleppt man nur unnötig Code mit und außerdem sollte ein ArrayAdapter TextViews enthalten, also schon aus polymorpher Sicht ist das Ableiten falsch.

Von den Problemen mit den Items abgesehen.


----------



## Tomate_Salat (6. Nov 2012)

mjdv hat gesagt.:


> Du musst eine Unterklasse von ArrayAdapter



Sehe das wie Schlingel. Wenn schon einen eigenen Adapter, dann bitte von BaseAdapter


----------



## bruce85 (6. Nov 2012)

Danke euch für die antworten.

Ich hab das mal mit ListActivity versucht und statt Spinner, habe ich jetzt einen ListView genommen.
Jetzt weiss ich nicht, wie ich das in der ListView anzeigen kann, ich hab das so versucht:


```
final ListView listView = new ListView(MenuActivity.this);
MyListActivity adapter = new MyListActivity();
listView.setAdapter(adapter);
```

setAdapter ist rot Markiert, woran könnte das denn liegen?

MfG


----------



## schlingel (6. Nov 2012)

Der Name MyListActivity deutet darauf hin, dass es kein Adapter sondern eine Activity ist.

Vermutlich ist das, das Problem. Aber Eclipse schreibt normalerweise eh eine Fehlermeldung was nicht passt.


----------



## bruce85 (6. Nov 2012)

Danke.

Aber wie könnte ich das dann in die ListView übergeben?

MfG


----------



## Tomate_Salat (6. Nov 2012)

In meinem ersten Post habe ich einen Link zu einem Tutorial von Vogella gepostet. Schau dir am besten dieses Tutorial mal komplett an.


----------



## bruce85 (6. Nov 2012)

Das habe ich auch gemacht, nur versteh ich das nicht ganz.

Irgendwie klappt das nicht.

MfG


----------



## Tomate_Salat (6. Nov 2012)

Was klappt irgendwie nicht? Fehlermeldungen? Logcat ausgaben?


----------



## bruce85 (6. Nov 2012)

Ich lasse auf ein Button Click ein DialogBox aufrufen:

```
new AlertDialog.Builder(MenuActivity.this)
	    	    .setTitle("Auswahl des Spielbrettes")
	    	    .setMessage("Bitte wähle ein Spielbrett aus:")
	    	    .setView(spinner)
	    	    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
	    	        public void onClick(DialogInterface dialog, int whichButton) {
	    	        	//finish();
	    	        }
	    	    }).setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
	    	        public void onClick(DialogInterface dialog, int whichButton) {
	    	            // Do nothing.
	    	        }
	    	    }).show();
```

bei setView lass ich den Spinner anzeigen und dort möchte ich die Einträge anzeigen lassen.

und hier mal die 2 klassen:

```
public class MyListActivity extends ListActivity {
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    String[] values = new String[] { "Test1", "Test2", "Test3",
        "Test4", "Test5", "Test6", "Test7", "Test8",
        "Test9", "Test10" };
    MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, values);
    setListAdapter(adapter);
  }

}
```


```
public class MySimpleArrayAdapter extends ArrayAdapter<String> {
  private final Context context;
  private final String[] values;

  public MySimpleArrayAdapter(Context context, String[] values) {
    super(context, R.layout.row, values);
    this.context = context;
    this.values = values;
  }

  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.row, parent, false);
    TextView textView = (TextView) rowView.findViewById(R.id.text);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
    textView.setText(values[position]);
    imageView.setImageResource(R.drawable.logo);

    return rowView;
  }
}
```

ich hab das erstmal zum test genommen, nur weiss ich nicht, wie ich diese jetzt in den Spinner anzeigen lassen kann.

Auf der Seite komme ich auch nicht ganz klar, hab das durchgelesen und ein Paar tests gemacht, leider ohne erfolg.

Ich bekomme kein Fehler, ich weiss nur nicht, wie ich das jetzt den Spinner übergebe.

MfG


----------



## Tomate_Salat (6. Nov 2012)

Wo erstellst du den Spinner? 
Hast du dem auch einen Adapter zugewiesen?


----------



## bruce85 (6. Nov 2012)

Hier:

```
final Spinner spinner = new Spinner(MenuActivity.this);
```

Nein, ich habe für den Spinner keinen adapter zugewiesen.

Edit: Hab den adapter jetzt so zugewiesen:

```
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MenuActivity.this, R.layout.row);
spinner.setAdapter(adapter);
```

MfG


----------



## Tomate_Salat (6. Nov 2012)

Du musst dem Spinner logischerweise einen Adapter mitgeben.

Spinners | Android Developers


----------



## bruce85 (6. Nov 2012)

Danke Dir.

Irgendwie bekomm ich jetzt ne exception.

```
java.lang.IllegalStateException: System services not available to Activities before onCreate()...................................
```

Habe die ja erstellt.
Hab das so versucht:

```
MyListActivity a = new MyListActivity();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(a, R.layout.row);
spinner.setAdapter(adapter);
```

Woran könnte das liegen?

MfG


----------



## Tomate_Salat (6. Nov 2012)

Bekommst du doch mitgeteilt:
[c]System services not available ... before onCreate()[/c]

Die betroffene Stelle muss nach dem onCreate ausgeführt werden. Vorher existiert ja deine Activity noch garnicht ;-)


----------



## bruce85 (6. Nov 2012)

Habe ich ja auch versucht, bekomme den gleichen fehler. 

MfG


----------



## Tomate_Salat (6. Nov 2012)

Zeig nochmal deinen Code. So sehen wir ja nicht, wo du das eingefügt hast ;-)


----------



## bruce85 (6. Nov 2012)

Ich erstell die liste dort, wo ich auch den Spinner anzeige, also weit unten nach onCreate:

```
MyListActivity list = new MyListActivity();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(list, R.layout.row);
	    		spinner.setAdapter(adapter);
	    		//spinner.add
	    		new AlertDialog.Builder(MenuActivity.this)
	    	    .setTitle("Auswahl des Spielbrettes")
	    	    .setMessage("Bitte wähle ein Spielbrett aus:")
	    	    .setView(spinner)
	    	    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
	    	        public void onClick(DialogInterface dialog, int whichButton) {
	    	        	//finish();
	    	        }
	    	    }).setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
	    	        public void onClick(DialogInterface dialog, int whichButton) {
	    	            // Do nothing.
	    	        }
	    	    }).show();
```

MfG


----------



## Tomate_Salat (6. Nov 2012)

Nope eben nicht. Den Fehler hätte ich aber auch oben schon sehen müssen...


```
MyListActivity a = new MyListActivity();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(a, R.layout.row);
```

Das onCreate von der Activity wurde nie aufgerufen. Denn du übergibst hier [c]a[/c] und kein Objekt deiner aktuellen Activity. Versuche es mal mit:
[c]ArrayAdapter<String> adapter = new ArrayAdapter<String>(MenuActivity.this, R.layout.row);[/c]


----------



## bruce85 (6. Nov 2012)

Ja, das ging ja fehlerfrei damit, aber da ist der Spinner leer, deshalb habe ich die liste erstellt und weise dann a zu.

Wie bekomm ich dann die liste im Spinner?

MfG


----------



## Tomate_Salat (6. Nov 2012)

Indem du den Adapter füllst. Z.b. indem du ein Array als 3ten Parameter an den Konstruktor übergibst:
http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter(android.content.Context, int, T[])

oder ihn einzeln erweiterst mittels add().

Die Dokumentation ist hier dein Freund ;-)


----------



## bruce85 (6. Nov 2012)

Die daten sind ja gefüllt, ich muss nur die listactivity in dem spinner bekommen.

Naja ich denke das hat alles kein Sinn, ich werde es halt irgendwie anders machen ohne Spinner.

Ich danke dir trotzdem für die Hilfe.

MfG


----------



## Tomate_Salat (6. Nov 2012)

bruce85 hat gesagt.:


> Die daten sind ja gefüllt, ich muss nur die listactivity in dem spinner bekommen.



Was ... nein! 

Vergiss mal komplett den ListView (ich glaube der verwirrt gerade zu sehr). Wenn du einen Spinner darstellen willst, brauchst du 2 Dinge:
- das Spinner-Objekt
- einen Adapter

Für den Adapter gibt es schöne Standardimplementierungen wie z.B. den ArrayAdapter. Den brauchst du nur noch mit Daten zu füllen, dem Spinner zuweisen und los gehts.

Der Spinner selber braucht kein ListenObjekt oder ähnliches um die Daten darstellen zu können. Wie Spinner und Adapter intern zusammenarbeiten ist jetzt erstmal egal. Versuch einfach mal einen ArrayAdapter zu erstellen, fülle diesen mit Demodaten und gib den dann dem Spinner-objekt. Dann sollte das ganze auch laufen.


----------



## bruce85 (6. Nov 2012)

Danke Dir.

Noch eine Frage:
Wenn ich bei google nach mein Problem suche, dann komme ich immer auf seiten mit ListView.

Ist es möglich im Spinner den Array bitmap mit zu übergeben?

So sieht es bis jetzt aus:

```
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MenuActivity.this, R.layout.row,R.id.text,text);
spinner.setAdapter(adapter);
```

Das klappt auch alles mit den texten, nur möchte ich die bitmaps mit übergeben.

Hab das erstmal so getestet:

```
ImageView icon=(ImageView) findViewById(R.id.icon);
icon.setImageBitmap(bitmap[0]);
```

Das funktioniert so garnicht.

MfG


----------



## Tomate_Salat (6. Nov 2012)

Nein. Afaik klappt das so nicht mehr mit dem ArrayAdapter. Hierfür würde ich dann schon einen BaseAdapter überschreiben.

Als Beispiel kann ich dir ein Stück Code aus meinem aktuellen Projekt zeigen:

```
public class HomeFragment extends SherlockFragment {
        public class ModelListAdapter extends BaseAdapter
        {
                @Override
                public int getCount() {
                        return model.size();
                }

                @Override
                public Object getItem(int position) {
                        return model.get(position);
                }

                @Override
                public long getItemId(int position) {
                        if(position>=model.size())
                                return -1;
                        
                        return model.get(position).getId();
                }

                @Override
                public View getView(int position, View convertView, ViewGroup parent) 
                {
                        if(position>=model.size())
                                return null;
                        
                        Home element=model.get(position);
                        
                        if(element==null)
                                return null;
                                                
                        View view=LayoutInflater.from(getActivity()).inflate(android.R.layout.simple_list_item_1, null, false);                 
                        TextView text=(TextView) view.findViewById(android.R.id.text1);
                        text.setText(element.getDescription());                 
                        //text.setCompoundDrawablesWithIntrinsicBounds(element.getImagePath(), null, null, null);
                        return view;
                }
                
        }
}
```

Gerade der auskommentierte Teil könnte für dich Interessant sein. Da setzte ich ein Bild links vom TextView. Ein neuer ImageView wird dadurch nicht benutzt. Wenn du einen ImageView haben willst, einfach ein LinearLayout drumrum,views adden und das LL zurückgeben.


----------



## bruce85 (6. Nov 2012)

Danke Dir.

Ich habe das jetzt so gelöst:

```
public class MyAdapter extends ArrayAdapter<String>
    {

            public MyAdapter(Context context, int textViewResourceId,
                        String[] objects) {
                  super(context, textViewResourceId, objects);
                  // TODO Auto-generated constructor stub
            }
            @Override
        public View getDropDownView(int position, View convertView,ViewGroup parent) {
            return getCustomView(position, convertView, parent);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return getCustomView(position, convertView, parent);
        }

        public View getCustomView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater=getLayoutInflater();
            View row=inflater.inflate(R.layout.row, parent, false);
            TextView label=(TextView)row.findViewById(R.id.text);
            label.setText(data1[position]);

            ImageView icon=(ImageView)row.findViewById(R.id.icon);
            icon.setImageBitmap(bitmap[position]);
            
            return row;
        }
       
   }
```


```
MyAdapter adapter = new MyAdapter(MenuActivity.this, R.layout.row,data1);
spinner.setAdapter(adapter);
```

Es funktioniert endlich und vielen Dank für die Hilfen.

MfG


----------



## mjdv (6. Nov 2012)

schlingel hat gesagt.:


> Bitte nicht von ArrayAdapter. Den Fehler habe ich auch als Anfänger gemacht. Da schleppt man nur unnötig Code mit und außerdem sollte ein ArrayAdapter TextViews enthalten, also schon aus polymorpher Sicht ist das Ableiten falsch.
> 
> Von den Problemen mit den Items abgesehen.



Verstehe ich nicht ganz, kannst du das mal genauer ausführen, wieso das ein Problem ist?

Ich meine in dem vogella Tutorial ist es auch so, und ich hatte den Mann eigentlich immer für sehr kompetent gehalten. Wundert mich also warum er davor nicht mal warnt.


----------

