Custom CursorAdapter, falsches Verhalten der ersten Zeile einer ListView

  • 3 Antworten
  • Letztes Antwortdatum
M

metzgore

Neues Mitglied
0
Hallo an alle,

ich bin gerade dabei die Notiz-App von den Google Übungen zu erweitern.

Dazu habe ich mir überlegt, dass man die Notizen über einen Kontextmenüeintrag hervorheben / markieren könnte. Habe dazu in der SQLite Datenbank eine Spalte in der Tabelle für Notizen angelegt, die entweder 1 für markieren oder 0 für nicht markieren enthält. Das Ändern dieses Wertes über das Kontextmenü funktioniert ohne Probleme. Nur das Anzeigen der Hervorhebung funktioniert nicht richtig.

Ich habe mir einen eigenen CursorAdapter geschrieben, da dadurch ja die einzelnen Notizen in einer ListView darstellbar sind.

Die Klasse sieht wie folgt aus:
Code:
public class NotesAdapter extends CursorAdapter {

	private LayoutInflater inflator;
	private int ciTitle, ciDate, ciNoteHighlighted;

	public NotesAdapter(Context context, Cursor c) {
		super(context, c);
		inflator = LayoutInflater.from(context);
		ciTitle = c.getColumnIndex(NotesDbAdapter.KEY_TITLE);
		ciDate = c.getColumnIndex(NotesDbAdapter.KEY_DATECREATED);
		ciNoteHighlighted = c
				.getColumnIndex(NotesDbAdapter.KEY_NOTEHIGHLIGHTED);
	}

	@Override
	public void bindView(View view, Context context, Cursor cursor) {

		TextView title = (TextView) view.findViewById(R.id.titleRow);
		String titleText = cursor.getString(ciTitle);

		TextView date = (TextView) view.findViewById(R.id.date);
		String dateText = cursor.getString(ciDate);

		String formattedDate = formatDateTime(context, dateText);

		boolean noteHighlighted = (cursor.getInt(ciNoteHighlighted) == 1) ? true
				: false;

		title.setText(titleText);
		date.setText(formattedDate);
		if (noteHighlighted) {
			title.setTypeface(null, Typeface.BOLD);
			title.setTextColor(title.getContext().getResources()
					.getColor(R.color.highlightColor));
			date.setTypeface(null, Typeface.BOLD);
			date.setTextColor(date.getContext().getResources()
					.getColor(R.color.highlightColor));
		}
	}

	@Override
	public View newView(Context context, Cursor cursor, ViewGroup parent) {
		return inflator.inflate(R.layout.notes_row, null);
	}

	public String formatDateTime(Context context, String timeToFormat) {

		String finalDateTime = "";

		SimpleDateFormat iso8601Format = new SimpleDateFormat(
				"yyyy-MM-dd HH:mm:ss");

		Date date = null;
		try {
			date = iso8601Format.parse(timeToFormat);
		} catch (ParseException e) {
			date = null;
		}

		if (date != null) {
			long when = date.getTime();
			int flags = 0;
			flags |= DateUtils.FORMAT_SHOW_DATE;
			flags |= DateUtils.FORMAT_ABBREV_MONTH;
			flags |= DateUtils.FORMAT_SHOW_YEAR;

			finalDateTime = DateUtils.formatDateTime(
					context, when + TimeZone.getDefault().getOffset(when),
					flags);
		}
		return finalDateTime;
	}
}

Sollte eigentlich funktionieren. Nun zu meinem Problem (in den beiden angehängten Bildern veranschaulicht):

Über meinen NotesAdapter wird ja die ListView entsprechend mit Daten gefüllt. Im ersten Bild sind die Notizen ohne Hervorhebung zu sehen. Hebe ich jetzt allerdings Notiz 2 oder Notiz 3 über das Kontextmenü hervor, dann wird automatisch auch Notiz 1 hervorgehoben, obwohl für Notiz 1 in der entsprechenden Spalte der DB-Tabelle eine 0 (also nicht hervorheben) eingetragen ist.

Leider finde ich den Fehler nicht und hoffe, dass mir hier vielleicht jemand helfen kann.

Edit: Hat denn niemand eine Idee? :unsure:
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    3,6 KB · Aufrufe: 180
  • Unbenannt2.PNG
    Unbenannt2.PNG
    5,2 KB · Aufrufe: 209
Zuletzt bearbeitet:
Hat denn niemand eine Idee? :unsure:
 
Hallo,
der Code den du gepostet hast scheint ok zu sein.
Bist du sicher das die Werte in der Datenbank stimmen?
(Lass dir am besten alles mal ausgeben.)
Gibt es defaultwerte für diese Spallte?
Hat NotesDbAdapter.KEY_NOTEHIGHLIGHTED den richtigen Wert (fängt mit 0 an zu zählen)?

Ist ciTitle die "1","2" in den Screenshots?
 
Die Werte in der Datenbank sind ok, das habe ich über die Kommandozeile während der Ausführung des Programmes überprüft. Als default-Wert wird 0 eingetragen, wenn eine neue Notiz angelegt wird. Und ja, 1, 2 und 3 sind die Titel der Notizen, die habe ich einfach aus Faulheit nur so benannt.

Hat NotesDbAdapter.KEY_NOTEHIGHLIGHTED den richtigen Wert (fängt mit 0 an zu zählen)?

Muss ich dann nochmal überprüfen.

Edit: So, ich bin gerade nochmal am drüberschauen. Ich versteh aber grad nicht ganz, was du mit der (zitierten) Frage genau meinst.

Edit2: Anscheinend hängt das ganze mit der Wiederverwendung von Views zusammen. Das Problem habe ich nun gelöst mit:

Code:
if (noteHighlighted) {
			title.setTypeface(null, Typeface.BOLD);
			title.setTextColor(title.getContext().getResources()
					.getColor(android.R.color.holo_blue_dark));
			date.setTypeface(null, Typeface.BOLD);
			date.setTextColor(date.getContext().getResources()
					.getColor(android.R.color.holo_blue_dark));
		} else {
			title.setTypeface(null, Typeface.NORMAL);
			title.setTextColor(title.getContext().getResources()
					.getColor(android.R.color.primary_text_dark));
			date.setTypeface(null, Typeface.NORMAL);
			date.setTextColor(date.getContext().getResources()
					.getColor(android.R.color.primary_text_dark));
		}
 
Zuletzt bearbeitet:
Zurück
Oben Unten