2016-05-24 12 views
1

Ich verwende den DownloadManager zum Herunterladen von Dateien und möchte für jeden Download eine Fortschrittsansicht in einem RecyclerView.ViewHolder aktualisieren.Ein Element in RecyclerViewAdapter mit Otto aktualisieren

Meine aktuelle Idee ist, Otto zu verwenden, um ein downloadProgressed-Ereignis zu veröffentlichen. Ich möchte, dass sich meine viewHolders im Event-Bus registrieren, aber ich bin mir nicht sicher, wo ich sie registrieren und abmelden soll.

Ist das eine gute Idee? Oder sollte ich nach einer besseren Lösung suchen?

+0

IIRC, Viewholders werden jedes Mal wiederverwendet, wenn ein Scroll-Ereignis eintritt. Ich denke also nicht, dass es eine gute Idee ist, etwas darin zu ändern. Für mich würde ich Otto in dem Fragment/der Aktivität abonnieren, die den Adapter enthält und 'notifyItemChanged (position)' von dort aufruft. – AimanB

+0

Klingt so, als müsste ich bei jedem Download eine for-Schleife verwenden, um die Position zu finden. Ist das genauso effizient wie nur auf ein Ereignis zu reagieren und sicherzustellen, dass das Objekt übereinstimmt, bevor die Fortschrittsanzeige geändert wird? Ich muss mich nur für Ereignisse registrieren, wenn der Viewholder erstellt wurde, nicht wenn Daten gebunden wurden. Ich kann einfach keinen guten Ort finden, um mich abzumelden. – Hackmodford

Antwort

0

Sie können den Ereignisbus im Fragment/Aktivität registrieren und Ereignisse über eine Funktion an Ihren Adapter übergeben.

Ihr Subsciber im Fragment/Aktivität wie dieses

@Subscribe public void downloadEvent(DownloadEvent event){ 
    adapter.updateDownloadState(event.getItemId(), event.getDownloadProgressPercentage()); 
} 

In Ihrem Adapter haben eine Funktion wie diese

public void updateDownloadState(int itemId, int progress){ 
    Object obj = findItemWithId(itemId); 
    obj.setProgress(progress); 
    this.notifyDataSetChanged(); 
} 

private Object findItemWithId(int itemId){ 
    // code to find your object in the list eg. by iteration 
} 
+0

Das habe ich getan. – Hackmodford

0

schauen Sie sollten die ViewHolders nicht binden. Der Zweck des ViewHolders besteht darin, die Daten im Adapter an die Ansichten zu binden. Sie sollten die Daten im Adapter aktualisieren und notifyItemChanged(index) aufrufen. Sie sollten sich wahrscheinlich keine Gedanken über die Leistung machen, es sei denn, Sie stoßen auf messbare Leistungsprobleme.

Wenn Sie über die Leistung besorgt sind.

  1. Zuerst implementieren Sie eine saubere Lösung (vorzeitige Optimierung ist sehr, sehr schlecht).

  2. Messen Sie Ihre Leistungsprobleme.

  3. Optimieren (z. B. den Index jedes Downloads im Adapter zwischenspeichern) und die Leistung mit Ihrem gemessenen Wert vergleichen.