ListView onClick und Sortierung

  • 28 Antworten
  • Letztes Antwortdatum
Wenn du den Inhalt einer ListView änderst musst du auf den Adapter wenn ich mich nicht täusche notifyDataSetChanged() aufrufen.


Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
  • Danke
Reaktionen: SaschaHa²
Vielen Dank, das wäre gerade meine nächste Frage gewesen. Der Fehler lag nämlich offenbar genau dort: Es hat alles schon vorher funktioniert, nur wurden die Ergebnisse als neue Einträge hinzugefügt und waren, ohne zu scrollen, nicht sichtbar. Daher habe ich dies gar nicht bemerkt :)

Danke also, jetzt sollte es funktionieren!

Edit: Es funktioniert nun, vielen Dank! :)

Eine Frage bezüglich der Code-Optimierung stellt sich mir dennoch: Da ich mehrere Klassen habe, wo ich auf genau die selbe Art auf eine ListView zugreifen muss, würde ich gerne all deren Methoden in eine extra Klasse auslagern, auf die ich dann zugreife. Ich würde nach Möglichkeit also gerne alles, was ich hier grün und blau gefärbt habe, in eine andere Klasse auslagern und von jeder Klasse darauf zugreifen.
Ist das möglich? Bei den grün gefärbten Methoden denke ich mal, dass es nicht ohne Weiteres möglich ist, aber wie sieht es bei der "private class" (blau) aus? Hier erstmal meine Klasse bis jetzt:

public class TestPlatzhalter extends MainActivity {
private List<ErgebnisListAdapter> meineErgebnisse = new ArrayList<ErgebnisListAdapter>();
private double lesen;
private double a, b, c, ab, abc;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.testplatzhalter);

populateMyErgebnisList();
populateErgebnisListView();

final EditText Lesen = (EditText)findViewById(R.id.TestLesen1);
Button Berechnen = (Button)findViewById(R.id.button1);

Berechnen.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick (View v) {
lesen = Double.parseDouble(Lesen.getText().toString());
if (Lesen.getText().toString().length() == 0) {
return;
}
a = lesen;
b = lesen*2;
c = lesen*1.5;
ab = a*b;
abc = ab*c;
clearErgebnisList();
populateMyErgebnisList();
populateErgebnisListView();
}
});
}

private void populateMyErgebnisList() {
meineErgebnisse.add(new ErgebnisListAdapter("a", getString(R.string.Laenge), "cm", Double.toString(a), "a"));
meineErgebnisse.add(new ErgebnisListAdapter("b", getString(R.string.Breite), "cm", Double.toString(b), "b"));
meineErgebnisse.add(new ErgebnisListAdapter("c", getString(R.string.Hoehe), "cm", Double.toString(c), "c"));
meineErgebnisse.add(new ErgebnisListAdapter("ab", getString(R.string.Flaeche), "cm²", Double.toString(ab), "a*b"));
meineErgebnisse.add(new ErgebnisListAdapter("abc", getString(R.string.Volumen), "cm³", Double.toString(abc), "a*b*c"));
}

private void populateErgebnisListView() {
ArrayAdapter<ErgebnisListAdapter> adapter = new MyErgebnisListAdapter();
ListView list = (ListView) findViewById(R.id.ErgebnisListView);
list.setAdapter(adapter);
}

private void clearErgebnisList() {
ArrayAdapter<ErgebnisListAdapter> adapter = new MyErgebnisListAdapter();
adapter.clear();
}


private class MyErgebnisListAdapter extends ArrayAdapter<ErgebnisListAdapter> {
public MyErgebnisListAdapter() {
super(TestPlatzhalter.this, R.layout.testplatzhalter, meineErgebnisse);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = convertView;
if (itemView == null) {
itemView = getLayoutInflater().inflate(R.layout.ergebnislistview, parent, false);
}

ErgebnisListAdapter er = meineErgebnisse.get(position);

TextView Buchstabe = (TextView) itemView.findViewById(R.id.ErgebnisBuchstabe);
Buchstabe.setText(er.getBuchstabe());

TextView Name = (TextView) itemView.findViewById(R.id.Variabelname);
Name.setText(er.getName());

TextView Einheit = (TextView) itemView.findViewById(R.id.Einheit);
Einheit.setText(er.getEinheit());

TextView Wert = (TextView) itemView.findViewById(R.id.Variabelwert);
Wert.setText(er.getWert());

TextView Formel = (TextView) itemView.findViewById(R.id.ErgebnisFormel);
Formel.setText(er.getFormel());

return itemView;
}
}
}
 
Zuletzt bearbeitet:
Das blaue kannst du einfach in eine eigene Datei mit entsprechendem Namen packen. Das grüne könntest du auch auslagern, würde ich aber nicht machen. So bleibt es übersichtlich und so viele Zeilen sind das ja auch nicht.

Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
  • Danke
Reaktionen: SaschaHa²
Datei oder Klasse? Ich habe es nämlich mit einer Klasse versucht, jedoch gab es dann das Problem, dass er ja auf die Einträge zugreifen will und diese nicht findet.

Und wie rufe ich das dann auf, wenn es ausgelagert ist?
Sorry für meine Anfanger-Fragen ;)
 
Ne eigene Klasse ist das blaue ja schon. Heisst ja "public class..."


Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
Leider funktioniert das mit dem auslagern nicht. Ich weiß nicht, wie ich die Datei mit Inhalt aufrufe bzw. anspreche :/
 
Wenn du in eclipse ne neue Klasse erstellst, die entsprechend benennst und dann den Inhalt reinkopierst kannst du da wie vorher drauf zugreifen.
Du brauchst also ne Datei mit .java am Ende
Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
Das habe ich schon versucht. Das Problem dabei ist, dass diese Klasse ja bereits auf den Inhalt der ListView zugreifen will. Der soll aber weiterhin in der anderen Klasse bleiben. In diesem Fall erkennt also die ausgelagerte Klasse "meineErgebnisse" nicht.

Die Idee mit dem Auslagern bestand darin, den QuellText auszulagern und per Befehl in einer Klasse aufzurufen und in diese zu integrieren.

Bei den Layouts zum Beispiel kann man mehrere Layouts mit "implements" in ein anderes Layout integrieren. Das scheint hier nicht so einfach zu gehen.

Vielleicht verstehe ich es auch nur einfach nicht... Jedenfalls danke!
 
Dann musst du "meineErgebnisse" eben mit über geben wenn du " new MyErgebnisListView()" aufrufst.
Und dann eben entsprechend ne Klassen variable in der neuen Klasse anlegen und im Konstruktor von MyErgebnisListView setzen.

Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
Zurück
Oben Unten