1. bauerj, 12.08.2011 #1
    bauerj

    bauerj Threadstarter Android-Hilfe.de Mitglied

    Hi,

    ich bin gerade dabei, meine erste Android-Applikation zu schreiben :)

    Leider habe ich im Moment folgendes Problem:
    Ich zeige mit einem ListAdapter eine Liste an, ähnlich wie in der Notepad-Beispielanwendung. Ich will aber den einzelnen TextViews in der Liste einzelne Hintergrundfarben, abhängig vom Inhalt anzeigen.

    Den Inhalt bekomme ich aber nicht einmal ausgelesen, da der Adapter die row.xml ja immer wieder anhängt und somit IDs doppelt und dreifach vergeben werden :S Wie kann ich die jetzt genau bestimmen, um in einer Schleife den Hintergrund zu ändern?

    Danke im Vorraus.
     
  2. soma-web, 12.08.2011 #2
    soma-web

    soma-web App-Anbieter (kostenpfl.)

    Erzeugst du die TextViews im Java Code oder in der XML? kannst ihnen doch beim erzeugen auch ids zuordnen, und dann gehst du im java code Textview.setBackgroundColor(Color) und dann sollte das doch gehen?

    Aber ich verstehe nicht wie du die TextViews erzeugst und wieso die die selbe id haben sollten?
     
  3. DieGoldeneMitte, 12.08.2011 #3
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Das mit den "doppelten IDs" stimmt nicht so ganz. Der Adapter rendert (normalerweise) im getView einfach den selben View für die Row immer wieder neu. Dort kannst Du dich dann auch einklinken und Farben setzen.
     
  4. bauerj, 12.08.2011 #4
    bauerj

    bauerj Threadstarter Android-Hilfe.de Mitglied

    So:
    PHP:
    String[] from = new String[] { DatabaseAdapter.KEY_DAY,DatabaseAdapter.KEY_S1,DatabaseAdapter.KEY_S2DatabaseAdapter.KEY_S3DatabaseAdapter.KEY_S4 };
            
    int[] to = new int[] { R.id.text1R.id.text2R.id.text3R.id.text4R.id.text5 };
        
    SimpleCursorAdapter adapter =
                new 
    SimpleCursorAdapter(thisR.layout.rowcfromto);
            
    setListAdapter(adapter);
    Das heißt, die einzige Möglichkeit wäre, die Adapterfunktion zu überschreiben, oder wie?:confused:
     
  5. sixi, 13.08.2011 #5
    sixi

    sixi Erfahrener Benutzer

    Spontan würd ich sagen ja :) Wobei das nun auch nicht die übelste Magic ist.

    Entweder du nimmst 'nen ArrayAdapter, dann sieht das ganze so aus:
    Code:
    class MyAdapter extends ArrayAdapter<String> {
    
    		private Context mContext;
    		private LayoutInflater mLayoutInflater;
    		private List<String> mObjects;
    
    		public MyAdapter(Context context, int textViewResourceId, List<String> objects) {
    			super(context, textViewResourceId, objects);
    
    			mLayoutInflater = getActivity().getLayoutInflater();
    			mObjects = objects;
    			mContext = context;
    		}
    
    		@Override
    		public View getView(int position, View convertView, ViewGroup parent) {
    			String s = getItem(position);
    			View v = convertView;
    			
    			if (v == null) {
    				v = mLayoutInflater.inflate(R.layout.DEINE_ROW, null);
    			}
    
    			TextView tv = (TextView) v.findViewById(R.id.TextView01);
    			tv.setText(s);
    			tv.setBackgroundColor(DEINE-COLOR); 
    
    			return v;
    		}
    }
    Hierbei ist halt ganz nett, dass du die Parametrisierung (also das <String>) auch durch eigene Entitiy-Klassen ersetzen kannst, z.B. 'ne Klasse
    Code:
    public class MeinEntity{
     private String titel;
     private String text;
     private Color hintergrundFarbe;
    
     ... getter&setter dafür ....
    }
    
    Die einzelnen Instanzen erzeugste dann über 'ne Klasse die deine Datenbank abfragt und dir 'ne Liste mit deinen Objekten zurückgibt.

    In deinem Fall wohl noch einfacher, aber nicht so flexibel du überschreibst direkt den SimpleCursorAdapter (nicht getestet... sollte aber ungefähr so gehen):

    Code:
    SimpleCursorAdapter adapter =   new SimpleCursorAdapter(this, R.layout.row, c, from, to){
    
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
      convertView = super.getView(position, convertView, parent);
      TextView tv = (TextView) convertView.findViewById(R.id.TextView01);
      tv.setText(s);
      tv.setBackgroundColor(DEINE-COLOR); 
      return convertView;
     }
    
    }; 
     setListAdapter(adapter);  
     
    bauerj bedankt sich.
  6. bauerj, 13.08.2011 #6
    bauerj

    bauerj Threadstarter Android-Hilfe.de Mitglied

    Wow, da hast du dir aber Mühe gegeben, danke :)

    Das werde ich gleich heute Abend ausprobieren, aber eine Frage habe ich noch:
    Die Funktion erwartet ja ein Integer als Parameter. Farben kenne ich aber nur als, "#fff" oder so. Kann ich die Hex-werte einfach umrechnen, oder wie?
     
  7. sixi, 13.08.2011 #7
    sixi

    sixi Erfahrener Benutzer

    Schau dir mal Android:Color an. Da sind ein ganz paar vordefinierte Farben enthalten, ansonsten z.B. per Color.rgb(r,g,b)
     
    bauerj bedankt sich.