Bitmap Array im Spinner übergeben?

bruce85

Bekanntes Mitglied
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:
Java:
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:
Java:
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
 
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.
 
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:

Java:
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
 
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.
 
In meinem ersten Post habe ich einen Link zu einem Tutorial von Vogella gepostet. Schau dir am besten dieses Tutorial mal komplett an.
 
Ich lasse auf ein Button Click ein DialogBox aufrufen:
Java:
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:
Java:
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);
  }

}

Java:
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
 
Hier:
Java:
final Spinner spinner = new Spinner(MenuActivity.this);

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

Edit: Hab den adapter jetzt so zugewiesen:
Java:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MenuActivity.this, R.layout.row);
spinner.setAdapter(adapter);

MfG
 
Zuletzt bearbeitet:
Danke Dir.

Irgendwie bekomm ich jetzt ne exception.
Java:
java.lang.IllegalStateException: System services not available to Activities before onCreate()...................................

Habe die ja erstellt.
Hab das so versucht:
Java:
MyListActivity a = new MyListActivity();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(a, R.layout.row);
spinner.setAdapter(adapter);

Woran könnte das liegen?

MfG
 
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 ;-)
 
Ich erstell die liste dort, wo ich auch den Spinner anzeige, also weit unten nach onCreate:
Java:
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
 
Nope eben nicht. Den Fehler hätte ich aber auch oben schon sehen müssen...

Java:
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]
 
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
 
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
 
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.
 
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:
Java:
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:
Java:
ImageView icon=(ImageView) findViewById(R.id.icon);
icon.setImageBitmap(bitmap[0]);

Das funktioniert so garnicht.

MfG
 
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:
Java:
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.
 
Danke Dir.

Ich habe das jetzt so gelöst:
Java:
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;
        }
       
   }
Java:
MyAdapter adapter = new MyAdapter(MenuActivity.this, R.layout.row,data1);
spinner.setAdapter(adapter);

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

MfG
 
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.
 

Zurück
Oben