Roman
- Forum-Beiträge: 20
29.07.2012, 17:45:34 via Website
29.07.2012 17:45:34 via Website
Hallo zusammen,
kurz eine Schilderung wie sich alles entwickelt hat.
Ich ziehe Informationen aus einer Datenbank, die ich in einer ListView anzeigen möchte. Binde ich den Cursor normal an einen SimpleCursorAdapter, kann ich beliebig in der ListView scrollen. Da ich in der Abfrage aber Zwischensummen per Sub-Selects bilde, die natürlich nicht in jeder Zeile auftreten, möchte ich ggf. die TextViews, welche die Zwischensummen darstellen, ausblenden können.
Da ich für den SimplecursorAdapter nur die Methode setViewBinder() gefunden habe, die zwar irgendwie in der Lage ist die Werte der TextViews zu speichern aber keine weiteren Eigenschaften, habe ich schließlich eine Klasse mit einem eigenen Adapter zu Hilfe gezogen.
Der Code der Klasse sieht folgendermaßen aus:
[code]public class C_mySimpleCursorAdapter extends SimpleCursorAdapter {
private Context _Context;
private Cursor _Cursor;
private String[] _Columns;
private int[] _TextViews;
private int _Layout;
public C_mySimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
// TODO Auto-generated constructor stub
this._Context = context;
this._Layout = layout;
this._Cursor = c;
this._Columns = from;
this._TextViews = to;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater theInflater = (LayoutInflater) _Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View listViewEntry = theInflater.inflate(_Layout, parent, false);
TextView tv_Content;
_Cursor.moveToPosition(position);
for (int i = 0; i < _TextViews.length; i++) {
tv_Content = (TextView) listViewEntry.findViewById(_TextViews[i]);
tv_Content.setText(_Cursor.getString(i + 1));
if (_Cursor.getString(i + 1).equals("%")) {
tv_Content.setHeight(0);
}
}
return listViewEntry;
};
}
[/code]
Prinzipiell funktioniert das vom Aussehen her wie ich das möchte, wie ich im Titel aber schon schreibe, kommt es zu einem Speicherüberlauf und zwar wenn man fleißig auf und ab scrollt.
In der Activity rufe ich den Adapter per
auf. Nun mein Frage, warum läuft der Speicher hier über? Ich bilde doch nur ein Objekt der Klasse und vermute daher, dass es irgendetwas mit der überschriebenen getView()-Methode zu tun hat, bin aber ratlos.
Schöne Grüße aus der Eifel,
Roman
P.S. wie füge ich denn den Code richtig ein? Ich klicke auf das Icon im Editorkopf und füge dann per copy + paste den Code aus Eclipse zwischen [.code][./code] ein...kommt aber in der Vorschau bei der Klasse nur eine "Quellcode-Wurst" raus obwohl es im Editor richtig angezeigt wird, bei der Beschreibung des Adapter-Aufrufs funktioniert es hingegen.
kurz eine Schilderung wie sich alles entwickelt hat.
Ich ziehe Informationen aus einer Datenbank, die ich in einer ListView anzeigen möchte. Binde ich den Cursor normal an einen SimpleCursorAdapter, kann ich beliebig in der ListView scrollen. Da ich in der Abfrage aber Zwischensummen per Sub-Selects bilde, die natürlich nicht in jeder Zeile auftreten, möchte ich ggf. die TextViews, welche die Zwischensummen darstellen, ausblenden können.
Da ich für den SimplecursorAdapter nur die Methode setViewBinder() gefunden habe, die zwar irgendwie in der Lage ist die Werte der TextViews zu speichern aber keine weiteren Eigenschaften, habe ich schließlich eine Klasse mit einem eigenen Adapter zu Hilfe gezogen.
Der Code der Klasse sieht folgendermaßen aus:
[code]public class C_mySimpleCursorAdapter extends SimpleCursorAdapter {
private Context _Context;
private Cursor _Cursor;
private String[] _Columns;
private int[] _TextViews;
private int _Layout;
public C_mySimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
// TODO Auto-generated constructor stub
this._Context = context;
this._Layout = layout;
this._Cursor = c;
this._Columns = from;
this._TextViews = to;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater theInflater = (LayoutInflater) _Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View listViewEntry = theInflater.inflate(_Layout, parent, false);
TextView tv_Content;
_Cursor.moveToPosition(position);
for (int i = 0; i < _TextViews.length; i++) {
tv_Content = (TextView) listViewEntry.findViewById(_TextViews[i]);
tv_Content.setText(_Cursor.getString(i + 1));
if (_Cursor.getString(i + 1).equals("%")) {
tv_Content.setHeight(0);
}
}
return listViewEntry;
};
}
[/code]
Prinzipiell funktioniert das vom Aussehen her wie ich das möchte, wie ich im Titel aber schon schreibe, kommt es zu einem Speicherüberlauf und zwar wenn man fleißig auf und ab scrollt.
In der Activity rufe ich den Adapter per
1mySCA = new C_mySimpleCursorAdapter(this, R.layout.listelayout, listeCursor, anzeigeSpalten, anzeigeViews);
2 lv_Liste.setAdapter(mySCA);
2 lv_Liste.setAdapter(mySCA);
auf. Nun mein Frage, warum läuft der Speicher hier über? Ich bilde doch nur ein Objekt der Klasse und vermute daher, dass es irgendetwas mit der überschriebenen getView()-Methode zu tun hat, bin aber ratlos.
Schöne Grüße aus der Eifel,
Roman
P.S. wie füge ich denn den Code richtig ein? Ich klicke auf das Icon im Editorkopf und füge dann per copy + paste den Code aus Eclipse zwischen [.code][./code] ein...kommt aber in der Vorschau bei der Klasse nur eine "Quellcode-Wurst" raus obwohl es im Editor richtig angezeigt wird, bei der Beschreibung des Adapter-Aufrufs funktioniert es hingegen.
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.