Fehler bei der Übergabe einer List<>

Hi,

ich rufe in einer Klasse A eine Methode getListViewFilling in Klasse B auf.
Diese Methode holt Datensätze aus einer DB (SQLite) und steckt diese in eine List.
Dafür habe ich eine Klasse C, welche nur aus Gettern und Settern besteht und den Datensatz spiegelt (gemischt int und String).
List liste = new ArrayList;

In Klasse A will ich nun die Datensätze einzeln aus der Liste raus holen und auf der GUI abbilden.
for (int i=0; i < liste.size(); i++){
c = liste.get(i);
}

Leider bekomme ich immer nur den letzten Datensatz aus der Tabelle der DB angezeigt, genau i mal (Anzahl der Datensätze per SQL aus DB geholt).

Hier der echte Code:
Klasse A:

		List<ViewFillingDataset> listeFillings = ds.getListViewFilling(this);
		ViewFillingDataset viewFillingDataset = null;
		
		for (int i=0; i < listeFillings.size(); i++){
			viewFillingDataset = listeFillings.get(i);
	        Log.e(TAG, i + ". Profil: " + viewFillingDataset.getProfilName());
        }
    }```

Klasse B:
```	public List<ViewFillingDataset> getListViewFilling(Context context){
		ViewFillingDataset viewFillingDataset = new ViewFillingDataset();
		List<ViewFillingDataset> listFillings = new ArrayList<ViewFillingDataset>();
		
		sqliteOpenHelper = new MySqliteOpenHelper(context);
		if (sqliteOpenHelper != null) {
			sqliteDatabase = sqliteOpenHelper.getWritableDatabase();
			if ( sqliteDatabase != null ) {
				String sql = "SELECT profile, SUM(amount) AS amount, unit_of_measurement, SUM(number) AS number FROM filling GROUP BY profile, unit_of_measurement;";
				Cursor viewFillingCursor = sqliteDatabase.rawQuery(sql, null); // TODO
				viewFillingCursor.moveToFirst();
				for (int i = 0; i < viewFillingCursor.getCount(); i++) {
					viewFillingDataset.setProfilName( viewFillingCursor.getString( 0 ));
                                        ...
					listFillings.add(viewFillingDataset);
					Log.d(TAG, i + ". " + viewFillingCursor.getString( 0 ));
					viewFillingCursor.moveToNext();
				}
				viewFillingCursor.close();
			}
		}
		sqliteOpenHelper.close();
		return listFillings;		
	}```

und LogCat (und GUI) zeigt:

>  0. product 1
>  1. product 2
>  2. product 3
>  0. Profil: product 3
>  1. Profil: product 3
>  2. Profil: product 3



**Warum kann ich nicht die Liste auslesen, wie sie erstellt wird,**
also product 1, product 2, product 3** ???**

Du verwendest den selben viewFillingDataset immer wieder. Daher referenziert die Liste i-mal auf den selben Datensatz.

Wieso?
In Klasse A Zeile 6 überschreibe ich ihn immer wieder.
viewFillingDataset = listeFillings.get(i);

? ? ?

Bezog sich auf das Befüllen in Klasse B

… in Klasse B

Alles klar! Vielen Dank!

Ich habe nicht damit gerechnet, dass ich das Objekt neu erzeugen muss.
Schließlich habe ich die Werte immer wieder überschreiben und ich dachte, dass ich entsprechend das Objekt mit geänderten Werten übergebe.
Ich verstehe es zwar nicht (die Maschinenlogik), aber freue mich, dass es jetzt funktioniert
und werde mir dieses Phänomen merken.
Zum einen wird es mir sicherlich noch einmal begegnen,
zum anderen finde ich wo möglich eine Erklärung dafür.
(Damit ich’s auch verstehen kann.)

Vielleicht hat jemand die Muse, es mir zu erklären?! :wink:

[QUOTE=frankmehlhop]Ich habe nicht damit gerechnet, dass ich das Objekt neu erzeugen muss.
Schließlich habe ich die Werte immer wieder überschreiben und ich dachte, dass ich entsprechend das Objekt mit geänderten Werten übergebe.
Ich verstehe es zwar nicht (die Maschinenlogik), aber freue mich, dass es jetzt funktioniert
und werde mir dieses Phänomen merken.[/QUOTE]
Die Variable viewFillingDataset referenziert immer auf das selbe Objekt, das bedeutet jeder Zugriff / jede Änderung über diese Variable ändert das Objekt. Bei der Übergabe der Variable an die List wird eine Kopie der Referenz auf das (selbe) Objekt an die List übergeben. Letztendlich hast Du eine Referenz in der Variable viewFillingDataset und i-Mal Referenzen in der List, die alle auf das selbe Objekt im Speicher verweisen.
Entscheidend ist hier das Verständnis des Zusammenhangs zwischen Objekt, Referenz auf selbiges und Variable (die Referenzen enthält)

Danke schön Michael,

ich habe gestern Abend schon ein wenig drüber nachgedacht und es mir versucht dinglich vorzustellen (mit kleinen Kistchen die was darin transportieren (die Werte)). Das mit der Referenz muss ich mir echt stärker ins Bewusstsein holen. Es wird immer auf die selbe Kiste gezeigt, egal was drin ist. :wink:

Danke nochmal! :slight_smile: