1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

ListAdapter Hintergrundfarbe abhängig vom Inhalt

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von bauerj, 12.08.2011.

  1. bauerj, 12.08.2011 #1
    bauerj

    bauerj Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    67
    Erhaltene Danke:
    8
    Registriert seit:
    04.01.2011
    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.)

    Beiträge:
    146
    Erhaltene Danke:
    18
    Registriert seit:
    06.07.2011
    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

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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

    Beiträge:
    67
    Erhaltene Danke:
    8
    Registriert seit:
    04.01.2011
    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

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    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

    Beiträge:
    67
    Erhaltene Danke:
    8
    Registriert seit:
    04.01.2011
    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

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    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.

Diese Seite empfehlen