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
 

schlingel

Gesperrter Benutzer
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.
 

bruce85

Bekanntes Mitglied
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
 

schlingel

Gesperrter Benutzer
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.
 
T

Tomate_Salat

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

bruce85

Bekanntes Mitglied
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
 

bruce85

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

bruce85

Bekanntes Mitglied
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
 
T

Tomate_Salat

Gast
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

Bekanntes Mitglied
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
 
T

Tomate_Salat

Gast
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]
 

bruce85

Bekanntes Mitglied
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
 

bruce85

Bekanntes Mitglied
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
 
T

Tomate_Salat

Gast
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

Bekanntes Mitglied
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
 
T

Tomate_Salat

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

bruce85

Bekanntes Mitglied
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
 

mjdv

Bekanntes Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Hintergrund von Bitmap entfernen Android & Cross-Platform Mobile Apps 2
B Bitmap OutOfMemoryError? Android & Cross-Platform Mobile Apps 2
L Android komisches Bitmap-Größe-Problem Android & Cross-Platform Mobile Apps 8
L Bitmap mit OnClickListener Android & Cross-Platform Mobile Apps 8
W String Array Pfad in Int setzen Android & Cross-Platform Mobile Apps 54
O Android Spinner-Array ändern Android & Cross-Platform Mobile Apps 6
A Mit Java neues item in ein string-array einer Strings.xml schreiben Android & Cross-Platform Mobile Apps 4
J Button array ID Problem Android & Cross-Platform Mobile Apps 2
A Android veränderbares Array abspeichern und auslesen Android & Cross-Platform Mobile Apps 7
A Android Button Array? Android & Cross-Platform Mobile Apps 6
M Array oder Vector Android & Cross-Platform Mobile Apps 4
O Array Android & Cross-Platform Mobile Apps 2
J Spinner wird nicht aktualisiert Android & Cross-Platform Mobile Apps 6
T Firestore Daten in Spinner Android & Cross-Platform Mobile Apps 0
C Zugriff auf die Position eines String- bzw Spinner-Arrays Android & Cross-Platform Mobile Apps 1
S Android Style vom Spinner ändern (Dropdown sowie Fontfarbe) Android & Cross-Platform Mobile Apps 1
J android Spinner funktioniert nicht Android & Cross-Platform Mobile Apps 14
P Android Probleme mit Spinner Android & Cross-Platform Mobile Apps 3
G Android Spinner dynamisch aus DB SQL Select befüllen Android & Cross-Platform Mobile Apps 10
N Android spinner.item index als integer ? Android & Cross-Platform Mobile Apps 10
L Android Problem mit "spinner" Android & Cross-Platform Mobile Apps 10
F Android Spinner mit Ids Android & Cross-Platform Mobile Apps 4
F Android Fehler in Spinner Android & Cross-Platform Mobile Apps 3
F Android Spinner zur Laufzeit mit verschiedenem Inhalt füllen Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben