Beiträge von KuJo

    Hallo,


    ich habe das Problem inzwischen gelöst.


    Für die einzelnen Navigations-Inhalte der Listview habe ich eine Klasse "Naviliste" definiert, in welcher alle Items gespeichert sind. Klickt jemand ein item an, dann wird für die neue Listview eine neue Liste generiert. Diese Listen werden indiziert, bekommen also eine feste ID zugewiesen.


    Wenn ich jetzt ein Item in der Listview anklicke, schiebe ich die ID der aktuellen Naviliste auf einen Stack und baue in einem neuen Fragment die neue Liste auf. Geht der User noch einen Schritt weiter, dann das gleiche usw.


    Wenn der Nutzer nun mit dem Back-Button einen Schritt zurück gehen möchte, geht das folgendermaßen:


    Den Aufruf des Back-Button fange ich mit onPressedBack() in der Parent-Activity ab und rufe darüber eine eigene Methode auf. Diese holt sich die zuletzt auf den Stack geschobene ID und baut damit dann in einem neuen Fragment die vorherige Liste wieder auf.


    Gleichzeitig lasse ich einen Zähler mitlaufen, der mitzählt, in welcher Navigationstiefe ich bin. Wird also bei jedem Vorwärts-Navigationsschritt um 1 erhöht. Bei rückwärts eben um 1 reduziert. Damit kann ich dann abfragen, ob der Nutzer irgendwann mal über die Wurzel der Navigation hinaus einen Rückschritt auswählt und in diesem Fall die aktuelle Activity mit ihren Fragmenten über finish() beenden.


    Das funktioniert super. Hat zwar ein wenig gedauert, bis aus der Idee dann der Code geworden ist. Aber es lübbt nu! :)

    Hallo!


    Ich habe da ein Problem mit den Fragmenten. Folgende Situation:


    Ich habe ein ListFragment in welchem in einer Liste eine Navigationsstruktur abgebildet werden soll. Konkret soll man beim Klick auf ein Item in der Liste in die nächste Stufe, also eine Hierarchie-Ebene weiter kommen. Die Listview habe ich über einen Adapter befüllt, den ich an das Fragment gebunden habe. Wird auch sauber dargstellt. Auch das Auswählen eines Items und die Anzeige der nächsten Navigations-Ebende klappt super. Das habe ich über die Fragment Transaction gelöst: Erst das bestehende ListFragment mit remove() entfernt und dann das gleiche Fragment neu erzeugt und mit add() wieder eingefügt. Für eine Rückwärts-Navigation rufe ich auch noch ein addToBackStack auf, bevor ich die Transaktion comitte. Dann die ArrayListe, die den ArrayAdapter befüllt, aktualisiert und an das neue Fragment angebunden. Diese Vorwärts-Navigation klappt super.


    Probleme habe ich aber mit der Rückwärts-Navigation. Der Nutzer soll wenn er den Back Butteon drückt wieder eine Navigations-Ebene zurück springen können. Deswegen habe ich ja auch das addToBackStack in meine Transaktion mit eingebaut. Wenn man nun den Back Button drückt, springt das Fragment auch um (zurück). Allerdings wird die vorherige Listenansicht nicht geladen bzw. wieder aufgebaut.


    Ich gehe mal davon aus, dass ich die Elemente der Liste irgendwo zwischenspeichern müsste, um sie dann beim Aufruf des vorherigen ListFragments für den Wiederaufbau der Liste verwenden zu können. Aber wie soll ich das machen? Ich habe gedacht, dass onSaveInstanceState dabei hilfreich wäre. Diese Methode wird bei der Transaktion aber gar nicht erst aufgerufen (habe ich mit einem Log.d("...","...") überprüft; wird nicht aufgerufen). Was ich dabei heraus gefunden habe, ist, dass onSaveInstanceState bei einer Rotation des Geräts aufgerufen wird. Also von z.B. Portrait auf Landscape oder umgekehrt. Aber das nutzt mir bei meinem Problem nichts.


    Also wie mache ich das am besten, damit meine ListView hinterher wieder hergestellt werden kann? Wo im Code speichere ich die Daten weg? Und vor allem - wo speicher ich die Daten hin? SharedPreferences wäre eine Möglichkeit, wenn ich nur eine weitere Navigations-Ebene hätte. Ich habe aber mehrere Stufen (bis in eine 5. Ebene). Da sind die SharedPreferences keine Lösung mehr, da es ein großer Aufwand wäre zu verfolgen, wo ich mich gerade befinde und welche gespeicherten Informationen für die Liste ich bei einem Schritt rückwärts wieder laden müsste.


    Ich habe mir schon überlegt, dass die Verwendung eines Stacks hiflreich wäre. Erst alle Items auf den Stack schieben. Als letztes Element die Anzahl der Einträge drauf schieben und dann das nächste ListFragment laden. Geht man noch eine Schritt weiter, wieder die aktuellen Element drauf schieben. Geht man einen Schritt zurück, dann zieht man sich die Items der vorherigen Ansicht vom Stack und baut die Liste so wieder auf. Allerdings wollte ich mal fragen, ob es da vielleicht eine elegantere Lösung gibt?


    Die Items in der Liste sind übrigens alles Strings. Pro Eintrag ein String, dargestellt über eine "android.R.layout.simple_list_item_1"-Liste.


    Gruß

    Hallo. Das geht nicht so einfach. Denn wenn man eine Apps veröffentlicht, wird der gesamte Quellcode in Dalvik-VM Bytecode übersetzt und dann zusammen mit den ganzen Ressourcen in ein apk-File gepackt. Der Sourcecode ist also gar nicht mehr im Original vorhanden und kann daher auch nicht so einfach ausgewiesen werden.


    Gruß

    Hallo,


    Google Play zeigt ja an, ob die ausgewählte App zum eigenen Android-Handy kompatibel ist. Meine Frage ist jetzt: Wird wirklich gecheckt, welche Android-Version ich auf meinem Handy habe? Ich könnte ja z.B. mit einem Custom ROM eine neuere Android-Version installiert haben, als es vom Hersteller bereits für mein Handy gibt. Beispiel: Offiziell 2.3.x, aber Custom ROM geflasht -> 4.0.x installiert. Demnach könnte das Handy ja ICS-Apps verwenden. Die Frage ist jetzt, ob Google sich nach offiziellen Hersteller-Angaben richtet oder nachdem, was ich wirklich auf meinem Handy drauf habe?


    Gruß

    Hallo.


    Dass ist aber nicht sehr performant, da du jede ZwischenVerschiebung in die DB schreibst, anstatt 1x am Ende, wenn der Eintrag dort gelandet ist, wo er am Ende hin soll.


    Gruß

    Hallo!


    Welche Datenbank verwendest du denn? Wegen der Andoid-eigenen DB SQLite gehe ich mal von SQLite aus:


    Ändern eines Datensatzes in der Datenbank erfolgt mit dem UPDATE-Befehl.
    Datensätze löschen macht man mit dem DELETE-Befehl.
    Einen Datensatz einfügen macht man in der Regel mit INSERT.


    Da ich jetzt keine DB-Schulung machen kann, empfehle ich dir, dieses SQLite-Tutorial (so nenne ich es einfach mal) zu studieren. Da ist alles zu SQLite und eben auch zu den von mir genannten Befehlen gut erklärt:
    -> http://www.ruhrtaler-softwareschmiede.de/bitmagie/sqlite


    Gruß


    EDIT/NACHTRAG
    Das Tutorial enthält nur die reine SQL-Syntax. Wie das in Java für Android ausschaut, findest du hier:
    -> http://www.android-developing.…e-android-tutorial-part-1


    Da sind auch die Befehle INSERT, UPDATE und DELETE in der Android-Java-Syntax erklärt.


    EDIT/NACHTRAG 2
    Zum Einfügen verstehe ich dein Problem nicht. Du musst doch irgendwann einmal die Tabelle mit deinen Datensätzen gefüllt haben. Dabei hast du doch auch eine ID mit angegeben. Genauso vergibst du beim erneuten Einfügen deine ID. Falls du eine Datenbank-interne ID meinst, die dass DB-System vergibt: Die kannst du vernachlässigen in deinem Fall. Arbeite einfach mit einer eigenen ID. Es ist halt nur wichtig, dass du auf die Datenintegrität achtest. So würde es Sinn machen, die ID per Constraint als UNIQUE zu deklarieren. Dann kann eine ID auch immer nur einmal vorkommen. Was Constraints sind, ist in der bereits weiter oben verlinkten Seite gut erkärt:
    -> http://www.ruhrtaler-softwares…/sqlite-tabellen-erzeugen


    Ja, eine ID sollte von der Idee die dahinter steht nicht verändert werden. In deinem Fall (dein Screenshot) ist eigentlich die Nr deine ID. Tausche die Begrifflichkeiten aus, aber die Idee die hinter der Art, wie man Zeilen verschiebt, bleibt die gleiche.


    EDIT/NACHTRAG 3
    Es gibt sogar HIER IM FORUM ein SQLite-Tutorial:
    -> Der Umgang mit SQLite

    Hallo!


    BTW - ich habe dieses Forum hier über Tapatalk gefunden, als ich in Tapatalk im Zug mal nach Android-Foren gesucht habe. Bei mir funzt alles, habe mich übrigens auch über Tapatalk hier im Forum registriert. Das hat also auch geklappt. Sitze zwar gerade am PC, aber bis jetzt hatte ich mit dem Forum keine Probleme in Tapatalk. Ich betreue übrigens zwei andere WBB3-Foren (einmal als Admin eines Gaming-Clans, den ich mal gegründet habe; und einmal als Co-Admin des Studierenden-Forum der FH Dortmund) , welche beide auch ohne Probleme mit dem Tapatalk-Plugin mobil verwendbar sind.


    BTW - wer sich dafür interessiert - Tapatalk stellt mit dem Plugin eine API zur Verfügung, mit der man eigene Apps für sein Forum programmieren kann. Die API wird dabei kostenlos zur Verfügung gestellt und auch fertige Apps dürfen ohne eine Zahlungsverpflichtung z.B. in den Market eingestellt werden:
    -> http://tapatalk.com/api/api.php


    Gruß

    Hallo!


    Meiner Meinung nach ist das recht simpel. Wie du schon geschrieben hast, musst du jedem Datensatz (eine Zeile/Row) eine eigene aufsteigende ID verpassen, welche in ihrem Aufstieg die Sortierung (Reihenfolge) wiedergibt. Wenn du jetzt einen Satz an eine andere Stelle verschiebst, dann wird nicht tatsächlich die eigentliche Zeile verschoben, sondern die zu verschiebende Zeile ausgelesen, gelöscht, die IDs der darüber oder drunter liegenden Rows (ich nenne es (Daten)Sätze) angepasst und dann die Zeile mit der neuen ID in die DB geschrieben:


    1. Den zu verschiebenden Satz zwischenspeichern (also in ein Hilfsarray oder Hilfsobjekt einlesen)
    2. Diesen Satz aus der Tabelle löschen
    3. Die Sätze zwischen der Quell-ID (der zu verschiebende Satz) und der Ziel-ID (da, wo der Satz hin soll), entsprechend anpassen, sprich, deren ID ändern
    4. In deinem zwischengespeicherten Satz die ID auf die neue ID ändern
    5. Den zwischengespeicherten Satz mit neuer ID in die DB schreiben


    Beispiel(tabelle):
    ID | Nr | Text
    1 | 1 | Hallo
    2 | 2 | Tag
    3 | 3 | Wetter
    4 | 4 | Sonne
    5 | 5 | Regen
    6 | 6 | Wind
    7 | 7 | Hagel
    8 | 8 | Sturm


    Wenn man jetzt den Satz (2 |2 | Tag) an die Stelle 6 verschieben möchtest, dann sieht das so aus:


    1. Den Satz mit der ID 2 aus der Tabelle auslesen und zwischenspeichen
    2. Den Satz mit der ID 2 aus der Tabelle löschen
    3. Mit einer Schleife aus allen Sätzen ab ID 3 bis ID 6 die IDs auslesen, um eins verringen und die IDs entsprechend neu in die Sätze schreiben. Aus Satz 3 wird dann 2, aus 4 dann 3, aus 5 wird 4 und aus 6 wird dann 5. Die neue Zwischen-Tabelle sieht zu diesem Zeitpunkt dann so aus:


    ID | Nr | Text
    1 | 1 | Hallo
    2 | 3 | Wetter
    3 | 4 | Sonne
    4 | 5 | Regen
    5 | 6 | Wind
    7 | 7 | Hagel
    8 | 6 | Sturm


    Der Satz mit der ID 6 fehlt hier, da er ja die ID 5 bekommen hat, usw. Weiter geht es dann so:


    4. Die ID des zwischengespeicherten Satzes änderst du nun auf die Ziel-ID, sprich, auf 6 ab.
    5. Dann schreibst du den zwischengespeicherten Satz komplett in die Datenbank. Die Tabelle sieht dann so aus:


    ID | Nr | Text
    1 | 1 | Hallo
    2 | 3 | Wetter
    3 | 4 | Sonne
    4 | 5 | Regen
    5 | 6 | Wind
    6 | 2 | Tag
    7 | 7 | Hagel
    8 | 6 | Sturm


    Die Werte des Satzes (sprich, Nr und Text) sind unverändert. Nur die IDs haben sich verändert. Man muss halt immer nur schauen, dass man die IDs bei allen Sätzen zwischen den zu verschiebenden Satz und der Ziel-Stelle an die neue Sortierung anpasst. Wenn man eine Zeile nach unten verschiebt, werden alle IDs zwischen Quell- und Ziel-ID um 1 verringert (-1). Wenn man eine Zeile nach oben verschiebt, werden alle IDs dazwischen um 1 erhöht (+1). Wichtig ist, dass die Schleife beim letztern Fall dann anders herum laufen muss. Man beginnt also immer mit dem Satz/ID, welcher direkt an die zuvor gelöschte Zeile angrenzt und zählt dann schrittweise zur Ziel-ID hin.


    Die DB-Befehle die du dazu benötigst (ich gehe mal davon aus, dass du SQLite verwendest), sind


    SELECT, um Sätze auszulesen (die zu verschiebende Zeile auslesen)
    DELETE, um Sätze zu löschen (löschen der zu verschiebenden Zeile)
    UPDATE, um Daten in Sätzen zu ändern (die IDs ändern, die zwischen Quell- und Ziel-ID liegen)
    INSERT, um Sätze zu schreiben (die zu verschiebende Zeile wieder einfügen, mit neuer ID)


    (schau mal hier: http://www.ruhrtaler-softwares…egen-aendern-und-loeschen )


    Ich hoffe, dass dir meine Erläuterungen aufzeigen, wie das Problem zu lösen ist. Einen Code (ich fange selbst erst gerade mit Android an ... ich kenne mich aber mit Programmierung und Datenbanken aus) kann ich dir aber leider (noch) nicht anbieten.


    Gruß