Android: Aufblasen layout dauert zu lange
Lösung gefunden!
Ich verwende jetzt einen ViewPager statt einen ViewFlipper.
Die Ansichten werden jetzt erzeugt, die in meiner run () - Methode (die ist schon da, da Hole ich meine Daten aus dem web) und saveed in einer Karte.
In meinem Hf habe ich nur rufen pagerAdapter.notifyDataSetChanged() die pagerAdapter nutzt die Karte von Ansichten, und es funktioniert glatt und schnell.
Also ich bin jetzt auf der Suche nach einem Weg, um die ViewPager endlos scrollen, aber das ist ein problem damit nicht verbunden ist 😉Danke Euch allen für Eure Antworten und halten Sie die gute Unterstützung.
Ich bin ganz neu in der Android Entwicklung und mit einem problem konfrontiert, während das aufblasen eines (riesigen) layout.
Ich habe immer einige Daten aus einem Webservice, der gut arbeitet, dann bin ich mit einem handler innerhalb meiner Tätigkeit, um diese Daten an das frontend. Hier ist mein handleMessage:
public void handleMessage(Message msg) {
LayoutInflater inflater = getLayoutInflater();
List<Integer> gamedays = new ArrayList<Integer>(games.keySet());
Collections.sort(gamedays);
for (Integer gameday : gamedays) {
View gamedaytable = inflater.inflate(R.layout.gamedaytable, null);
TableLayout table = (TableLayout) gamedaytable.findViewById(R.id.gameDayTable);
table.removeAllViews();
List<Game> gamelist = games.get(gameday);
int rowcount = 2;
for (Game game : gamelist) {
View tableRow = inflater.inflate(R.layout.gamedayrow, null);
TextView homeTeam = (TextView) tableRow.findViewById(R.id.gameDayHome);
TextView awayTeam = (TextView) tableRow.findViewById(R.id.gameDayAway);
TextView gameResult = (TextView) tableRow.findViewById(R.id.gameDayResult);
gameResult.setBackgroundResource(R.drawable.resultbackground);
homeTeam.setText(game.getHomeTeam().getName());
awayTeam.setText(game.getAwayTeam().getName());
if (game.getHomegoals() < 0 || game.getAwaygoals() < 0) {
gameResult.setText("-:-");
} else {
gameResult.setText(game.getHomegoals() + ":" + game.getAwaygoals());
}
if (rowcount % 2 == 0) {
tableRow.setBackgroundColor(0xffdee0dd);
} else {
//setting alternative background
tableRow.setBackgroundColor(0xfff1f3f0);
}
rowcount++;
table.addView(tableRow);
}
flipper.addView(gamedaytable);
}
flipper.setDisplayedChild(thisgameday - 1);
pd.dismiss();
}
Mein Problem ist, dass dieser code läuft ganz langsam und d die processdialog friert für etwa 1 Sekunde, bevor es verschwindet und das layout wird angezeigt.
Spiele besteht aus 34 Einträge enthält 9 Einträge von selbst.
Also ich bin das hinzufügen 34 Ansichten aus einem relativeLayout () enthält die Tabelle
Ich denke, das problem ist, dass android beginnt zu zeichnen und calculte das layout und das dauert zu lange.
Wenn ich richtig bin kann ich nicht verwenden AsynTask, weil ich nicht tun kann, UI-Sachen dort und im tun-UI-Zeugs nur.
Ich Suche nach einem Weg, um die dialog-Prozess nicht einfrieren, während dies zu tun.
Oder vielleicht mache ich etwas komplett falsch
R. layout.gamedaytable:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff1f3f0"
android:focusableInTouchMode="false" >
<TableLayout
android:id="@+id/gameDayTable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:focusableInTouchMode="false" >
</TableLayout>
</RelativeLayout>
R. layout.gamedayrow:
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tableRow1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusableInTouchMode="false"
android:paddingBottom="5dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/gameDayHome"
style="@style/textsizeSmallScreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="Mannschaft 1" />
<TextView
android:id="@+id/textView2"
style="@style/textsizeSmallScreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:text=":" />
<TextView
android:id="@+id/gameDayAway"
style="@style/textsizeSmallScreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mannschaft 2" />
<TextView
android:id="@+id/gameDayResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="5dp"
android:background="@drawable/resultbackground"
android:paddingLeft="10dip"
android:text="0:5"
android:textColor="#FFFFFF"
android:textSize="11dp"
android:textStyle="bold"
android:typeface="monospace" />
</TableRow>
Zusätzliche Info:
Dies ist, wie die Tabelle Aussehen sollte.
Also ich bin mir nicht sicher, ob dies wirklich so sein sollte eine ListView, weil für mich seine tabledata 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheinen Sie zu sein, bauen Sie eine Liste, Sie sollten wahrscheinlich betrachten Sie ein ListView, die haben die Vorteile nur benötigen zum erstellen der Benutzeroberfläche für die Anzahl der Zeilen, die zurzeit gezeigt wird, und auch anzeigen wieder zu verwenden, so dass Sie nicht brauchen, zu füllen Sie so viele Zeilen.
Lösung gefunden!
Ich verwende jetzt einen ViewPager statt einen ViewFlipper. Die Ansichten werden jetzt erzeugt, die in meiner run () - Methode (die ist schon da, da Hole ich meine Daten aus dem web) und saveed in einer Karte. In meinem Hf habe ich nur rufen pagerAdapter.notifyDataSetChanged() die pagerAdapter nutzt die Karte von Ansichten, und es funktioniert glatt und schnell. Also ich bin jetzt auf der Suche nach einem Weg, um die ViewPager endlos scrollen, aber das ist ein problem damit nicht verbunden ist 😉
Danke Euch allen für Eure Antworten und halten Sie die gute Unterstützung.
Ist es besser zu gehen für das Listview-Steuerelement. Auch wir können hinzufügen, mehr als ein design der Zeilen in der listview in einer optimierten Art und Weise, die verbessert die Leistung besser.
Können Sie definitiv tun dies auf eine
AsyncTask
. Sie können zwar nicht für die Aktualisierung der Benutzeroberfläche auf diedoInBackground
Methode eines AsyncTask, können Sie aus deronProgressUpdate
.Ich würde brechen Sie den code, so dass Sie die Iteration durch die Elemente, während in
doInBackground
rufenpublishProgress
für jedes Element, und führen Sie dann die Aktualisierung der Benutzeroberfläche für das Element, wenn Sie einen Rückruf inonProgressUpdate
.