Dies ist die Art, wie ich es endlich gelöst (nach vielen Iterationen und verschiedene Implementierungen). Es ist ein bisschen schwierig, aber im Grunde brauchen Sie drei Dinge:
- Ein AsyncTask, die Meta-Daten
- Ein Scroll-Hörer sammelt, die uns sagt, wenn der Benutzer Scrollen gestoppt/
- Ein kluger Algorithmus schleudert, die jeden sichtbar findet Zeile, die den Adapter nur Updates aktualisiert werden muss, und fordert, dass bestimmte Zeile
Dies ist die Art, wie ich entworfen und implementiert es:
Ich schrieb ausführlicher über it here, und bitte sehen Sie die github code für die komplette Implementation.
private class UpdaterAsyncTask extends AsyncTask<Void, Void, Void> {
boolean isRunning = true;
public void stop() {
isRunning = false;
}
@Override
protected Void doInBackground(Void... params) {
while (isRunning) {
// Gather data about your adapter objects
// If an object has changed, mark it as dirty
publishProgress();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... params) {
super.onProgressUpdate();
// Update only when we're not scrolling, and only for visible views
if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
int start = mListview.getFirstVisiblePosition();
for(int i = start, j = mListview.getLastVisiblePosition(); i<=j; i++) {
View view = mListview.getChildAt(i-start);
if (((Content)mListview.getItemAtPosition(i)).dirty) {
mListview.getAdapter().getView(i, view, mListview); // Tell the adapter to update this view
}
}
}
}
}
Hallo, ich versuche es zu machen, aber ich habe einen Pb. Wenn ich BackButton drücke, wird die dl fortgesetzt (das ist was ich will), aber wenn ich in dieser Ansicht zurückkomme, bewegen sich progressBars nicht. Kannst du ein Beispiel für deinen Adapter nennen? Funktioniert es wie ich, wenn Sie zurück drücken und zur selben Ansicht zurückkehren? – Cocorico
Ja, es funktioniert sowohl beim Start der Aktivität als auch beim Fortsetzen der Aktivität (aus einem angehaltenen Zustand). Sehen Sie sich 'private void refreshScreen()' im Quelltext hier an: https://github.com/slidese/SGU/blob/master/src/se/slide/sgu/StartActivity.java – Mike