ListAdapter Hintergrundfarbe abhängig vom Inhalt

bauerj

bauerj

Ambitioniertes Mitglied
8
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.
 
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?
 
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.
 
soma-web schrieb:
Aber ich verstehe nicht wie du die TextViews erzeugst und wieso die die selbe id haben sollten?
So:
PHP:
String[] from = new String[] { DatabaseAdapter.KEY_DAY,DatabaseAdapter.KEY_S1,DatabaseAdapter.KEY_S2, DatabaseAdapter.KEY_S3, DatabaseAdapter.KEY_S4 };
        int[] to = new int[] { R.id.text1, R.id.text2, R.id.text3, R.id.text4, R.id.text5 };
    SimpleCursorAdapter adapter =
            new SimpleCursorAdapter(this, R.layout.row, c, from, to);
        setListAdapter(adapter);
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.
Das heißt, die einzige Möglichkeit wäre, die Adapterfunktion zu überschreiben, oder wie?:confused:
 
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);
 
  • Danke
Reaktionen: bauerj
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?
 
Schau dir mal Android:Color an. Da sind ein ganz paar vordefinierte Farben enthalten, ansonsten z.B. per Color.rgb(r,g,b)
 
  • Danke
Reaktionen: bauerj

Ähnliche Themen

H
  • HerrFatalVonError
Antworten
4
Aufrufe
781
jogimuc
J
A
Antworten
1
Aufrufe
705
swa00
swa00
S
Antworten
15
Aufrufe
1.493
shareking
S
Zurück
Oben Unten