Ich habe eine Aktivität, die eine scrollbare Liste (sagen wir eine Spalte) von programmatisch erstellten Schaltflächen aus einer Liste, die das Ergebnis einer SQLite Tabelle gelesen wird und mein Problem ist, dass die Liste wächst (und so die Anzahl der Tasten) das erste Mal auf dem Bildschirm wird langsam (im Moment dauert 3 Sekunden mit 50 Tasten zu zeichnen), also suche ich nach einer Lösung für diese.Beschleunigen große Reihe von programmatisch erstellten Schaltflächen anzuzeigen
Zuerst dachte ich über die Verwendung eines Threads (Runnable, Handler oder was auch immer), sagen wir einen neuen Thread innerhalb der For erstellen, die über die Liste iteriert, aber es funktioniert nicht (oder zumindest nicht um es zum arbeiten zu bringen) so ist meine Frage die nächste:
Ausgehend von einer Liste <> das ist die am besten geeignete Möglichkeit, eine große Reihe von Bildlaufschaltflächen zu erstellen, so Benutzer nicht solche Verzögerung beim Zugriff auf den Bildschirm.
Paginieren könnte eine Option sein, aber ich möchte zuerst über andere Möglichkeiten wissen und diese als letzte Ressource verlassen.
Danke, und unten ist mein Code.
public static void createButtons(LinearLayout llContainer,
List<TestType> TestTypes, List<Test> Tests,
int buttonFontSize) {
Context oContext = llContainer.getContext();
String strTheme = TMAppearance.getThemeFromPreferences(oContext);
testMe = ((ApplicationConfiguration)oContext.getApplicationContext());
int callerActivity = TestTypes!=null ? 2 : 1;
if (TestTypes!=null || Tests!=null) {
int lCols = strTheme.equals(testMe.theme_vivid) ? 1 : 2;
//int sourceElementIndex = 0;
int originListSize = calculateOriginalListSize(callerActivity, TestTypes, Tests);
int lRows = (int) Math.ceil((double)originListSize/lCols);
List<String> aStartColors = TMUtils_ThemeVivid.generateStartColorArray(lRows, oContext);
List<String> aEndColors = TMUtils_ThemeVivid.generateEndColorArray(lRows, oContext);
for (i = 0; i < lRows; i++) {
LinearLayout outerButtonLayout = generateOuterButtonLayout(oContext);
for (j = 0; j < lCols; j++) {
final Thread r = new Thread() {
public void run() {
LinearLayout innerButtonLayout = generateInnerButtonLayout(oContext);
outerButtonLayout.addView(innerButtonLayout, j);
if (sourceElementIndex<originListSize){
final TMButton oButton = new TMButton(oContext);
if (callerActivity==1) { //testMenu
setTestMenuButtonSettings(oButton, sourceElementIndex, Tests);
} else {
if (callerActivity==2) { //testTypeMenu
setTestTypeMenuButtonSettings(oButton, sourceElementIndex, TestTypes);
}
}
if (strTheme.equals(testMe.theme_vivid)){
oButton.fontSize = buttonFontSize;
oButton.gradientStartColor = aStartColors.get(i);
oButton.gradientEndColor = aEndColors.get(i);
}else{
if (strTheme.equals(testMe.theme_purple)){
oButton.gradientStartColor = testMe.btnStartColor_purple;
oButton.gradientEndColor = testMe.btnEndColor_purple;
}
}
configureButton(oButton, callerActivity);
oButton.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Context oContext = v.getContext();
TMButton oButton = (TMButton) v;
int callerActivity = Integer.valueOf(v.getTag().toString().split("@")[0]);
String sourceId = String.valueOf(v.getTag().toString().split("@")[1]);
if(event.getAction() == MotionEvent.ACTION_DOWN) { //pressed
setButtonPressed(oButton);
TMSound.playButtonSound(oContext);
} else if (event.getAction() == MotionEvent.ACTION_UP) { //released
setButtonReleased(oButton);
startTargetActivity(callerActivity, sourceId, oContext);
}
return true;
}
});
TMAppearance.doButtonAnimation(oContext, oButton, i);
innerButtonLayout.addView(oButton);
sourceElementIndex++;
}
}
};
r.run();
}
llContainer.addView(outerButtonLayout);
}
}
}
gibt es etwas, über die Verwendung von 'ListView' oder' RecycleView', die Sie gegenüberstehen? Sie können sehr flexibel sein, indem Sie benutzerdefinierte Layouts verwenden. – Barns
Vielen Dank für Ihre Antwort. Barns52, nein, natürlich bin ich nicht gegen ListView und in Wirklichkeit untersuche ich, wie man eine ListView implementiert, weil meine Buttons programmgesteuert generiert werden. Würden Sie denken, ich könnte ein ListView mit dynamisch generierten Tasten ohne Probleme verwenden? –
Ich mag ListView (Nostalgie? ;-)), aber RecyclerView wurde eingeführt mit einer besseren Performance im Vergleich zu ListView, z. beim Scrollen. – 0X0nosugar