Hallo,
ich versuche verzweifelt aus einer Datenbank TextViews darzustellen. Das Problem ist, dass die App immer hängt, wenn ich sie hinzufüge.
Wie kann ich das denn im Hintergrund machen?
Die TextViews sollen in einem Fragment dargestellt werden.
Hallo,
ich versuche verzweifelt aus einer Datenbank TextViews darzustellen. Das Problem ist, dass die App immer hängt, wenn ich sie hinzufüge.
Wie kann ich das denn im Hintergrund machen?
Die TextViews sollen in einem Fragment dargestellt werden.
Hallo,
wo hängt denn die App? Bitte etwas genauer.
Aus einer Datenbank kanst du nur Texte auslesen und die dan in Textviews oder besser in eine Liste darstellen.
Ist das Auslesen aus der Datenbank so langsam dann mache das nicht im UI Thraed.
Hallo,
wo hängt denn die App? Bitte etwas genauer.
Aus einer Datenbank kanst du nur Texte auslesen und die dan in Textviews oder besser in eine Liste darstellen.
Ist das Auslesen aus der Datenbank so langsam dann mache das nicht im UI Thraed.
Die App hängt, wenn ich TextViews auf der GUI-Oberfläche darstellen will. Die Daten aus der Datenbank sind schnell im Speicher.
Ich brauche also etwas, dass die TextViews erst dann hinzugefügt werden, wenn das Fragment angezeigt wird.
In welcher Methode fügst du die textviews hinzu. oncreateView oder onactivitycreated .
Wie ist dein layout aufgebaut mit XML oder willst du es dynamisch erstellen?
Zeige mal wie du das machst.
In welcher Methode fügst du die textviews hinzu. oncreateView oder onactivitycreated .
Wie ist dein layout aufgebaut mit XML oder willst du es dynamisch erstellen?
Zeige mal wie du das machst.
Hallo,
ich mache das folgendermaßen:
Dieser Code ist im onCreateView()-Teil:
for (final ReadEvent readevent : alldatesmonthly_init_previous) {
long difference = (readevent.getDtstart() - calendar_millis) / 1000 / 24 / 60 / 60;
MonthFragment.this.addDate((int) difference + MonthFragment.this.start - 1, readevent.getEventname(), readevent.getCalendarid(), readevent.getEventcolor());
}
addDate:
private void addDate(int numoflinearlayout, String title, long calendarid, String color) {
Events events = new Events(this.c);
if(color == null) {
color = events.getCalendarColor(calendarid);
}
/*int color_parsed;
try {
color_parsed = Color.parseColor(color);
} catch(Exception e) {
color_parsed = (0xff000000 + Integer.parseInt(color));
}*/
showPopup(numoflinearlayout, title, color);
}
Alles anzeigen
showPopup():
private void showPopup(int numoflinearlayout, String title, String color) {
final LinearLayout linearlayout = new LinearLayout(this.c);
final LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layout.setMargins(0, 1, 0, 0);
linearlayout.setLayoutParams(layout);
int color_parsed;
try {
color_parsed = Color.parseColor(color);
} catch(Exception e) {
color_parsed = (0xff000000 + Integer.parseInt(color));
}
//Color.parseColor(color)
linearlayout.setBackgroundColor(color_parsed);
linearlayout.setOrientation(LinearLayout.HORIZONTAL);
final TextView txtview2 = new TextView(this.c);
txtview2.setText(title);
txtview2.setTextSize(9);
txtview2.setSingleLine(false);
linearlayout.addView(txtview2);
try {
linearlayouts.get(numoflinearlayout).addView(linearlayout);
}
catch (Exception e) {
}
}
Alles anzeigen
Das alles ist in einem Fragment.
Mein Wunsch wäre es, dass showPopup() in einem Hintergrundprozess aufgerufen wird.
Hallo wieso machst du das alles in der onCreateView Methode ? Dort Inflate ich nur das Xml Layout.
return inflater.inflate(R.layout.start, null);
Die onActivityCreated Benutze ich wie die onCreate von einer Activity.
Wie viele Linearlayouts erstellst du so? Da würde sich doch eine custom Liste besser anbieten.
Eigentlich ist das was du da machst eine Liste.
Das mit dem Hindergund Prozess schaué ich mir noch mal an.
Alles anzeigenHallo wieso machst du das alles in der onCreateView Methode ? Dort Inflate ich nur das Xml Layout.
return inflater.inflate(R.layout.start, null);
Die onActivityCreated Benutze ich wie die onCreate von einer Activity.
Wie viele Linearlayouts erstellst du so? Da würde sich doch eine custom Liste besser anbieten.
Eigentlich ist das was du da machst eine Liste.
Das mit dem Hindergund Prozess schaué ich mir noch mal an.
Ja, ich bin auch gespannt, wie man im Hintergrund GUI Elemente hinzufügt.
Wenn ich die Funktion addDates() in onActivityCreated() aufrufe, dann hat das macht das keinen Unterschied. Die App hängt, wenn ich schnell scrollen will.
Es gibt eine App, da sehe ich, dass sie das kann (acalendar).
Ist das dann als AsyncTask? Ich denke nicht... Hm.
Dieses hier macht auf einigen Handys, dass es tatsächlich im Hintergrund geladen wird:
new Handler().post(new Runnable() {
@Override
public void run() {
long difference = (readevent.getDtstart() - calendar_millis) / 1000 / 24 / 60 / 60;
MonthFragment.this.addDate((int) difference + MonthFragment.this.start - 1, readevent.getEventname(), readevent.getCalendarid(), readevent.getEventcolor());
}
});
Alles anzeigen
Aber leider nur auf einigen.
Also ein Layout in einem anderen thread laden Inflaten geht nicht. Du kannst rechenintrnsive Sachen in einen extra thread machen.
Wie ich schon sagte ist es sinnvoller Listen usw. zu benutzen die sind auf jedenfall Performander. Das das scrollen so lange dauert ligt daran das die Layouts immer wieder neu erstellt werden müssen. Denn du speicherst sie auch nirgends. Du erstellst sie direkt auf den ui thread zur Laufzeit.
Denn Aufbau deines Layout kannst du nicht so einfach komplet in einen extra Thread verschieben. Denn du greifst zwischendurch wieder auf den Ui Thread zu. z.B. hier "final LinearLayout linearlayout = new LinearLayout(this.c);"
"linearlayouts.get(numoflinearlayout).addView(linearlayout);"
Da müstest du mit "Handlern" arbeiten. Das alles wird dir das Problem nicht lösen, denn das immer wieder neu erzeugen der Layouts auf dem Ui dauert zu lange.
Welche Ansicht von dem aCalendar möchtest du nach stellen. Der arbeitet da aber mit ziemlich festen Layouts.
Was da wieder für Listen spricht.
Eine Liste von Layouts ist nicht zum Scrollen gedacht. Srollen von TextViews in einem Layout geht da schon schneller.
In der App wird auch ein festes Layout benutz und nur die Daten werden erneuert. Das sieht man daran das das Layout schon steht und Thermine usw erst etwas später kommen. Der baut bestimmt nicht das Layout so auf wie du.
Du willst doch auch auf Einträge klicken können und diese nicht nur Azeigen. Da kommst du nicht um eine andere Lösungen rum.
Wieso willst du das Rad nochmal erfinden?
Das Thema hatten wir doch schon in einem früheren Post. Überdenke dein Layout Konzept nochmal gründlich.
Ok, mit Listen ging es. (Gelöst)
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!