2016-06-07 31 views
26

Sto chiedendo immagini dal presentatore in adattatore:Che cos'è il ciclo di vita per l'adattatore RecyclerView?

@Override 
    public void onBindViewHolder(SiteAdapter.ViewHolder holder, int position) 
    { 
    Site site = sites.get(position); 
    holder.siteName.setText(site.getName()); 
    requestHolderLogo(holder, site.getLinks().getLogoUrl()); 
    } 

    private void requestHolderLogo(final ViewHolder holder, final String logoUrl) 
    { 
    compositeSubscription.add(
     presenter.bitmap(logoUrl) 
     .subscribe(
      bitmap -> { 
      holder.siteLogo.setImageBitmap(bitmap); 
      holder.siteLogo.setVisibility(View.VISIBLE); 
      }, 
      error -> { 
      holder.siteName.setVisibility(View.VISIBLE); 
      }) 
    ); 
    } 

dovrei cancellare l'iscrizione quando ViewHolder viene riutilizzato. È facile.

Ma come interrompere tutte le sottoscrizioni quando la vista viene distrutta? Vorrei anche probabilmente vanificare riferimento presentatore per evitare perdita di memoria

+8

Si prega di spiegare il motivo per cui downvoting –

risposta

11

Penso che il modo migliore per farlo sarebbe quello di:

  1. tenere un riferimento subscription nel SiteAdapter.ViewHolder
  2. unsubscribe l'oggetto subscription a onBindViewHolder (si chiama quando la ViewHolder viene riutilizzato)
  3. mantenere l'oggetto CompositeSubscription nel adapter
  4. Utilizzare il metodo della vostra Adapter-unsubscribe il compositeSubscription

Come così onDetachedFromRecyclerView:

public class SiteAdapter extends RecyclerView.Adapter<SiteAdapter.ViewHolder> { 

    private CompositeSubscription compositeSubscription = new CompositeSubscription(); 

    // other needed SiteAdapter methods 

    @Override 
    public void onBindViewHolder(SiteAdapter.ViewHolder holder, int position) { 
     if (holder.subscription != null && !holder.subscription.isUnsubscribed()) { 
      compositeSubscription.remove(holder.subscription); 
      // this will unsubscribe the subscription as well 
     } 
     Site site = sites.get(position); 
     holder.siteName.setText(site.getName()); 
     requestHolderLogo(holder, site.getLinks().getLogoUrl()); 
    } 

    private void requestHolderLogo(final SiteAdapter.ViewHolder holder, final String logoUrl) { 
     holder.subscription = presenter.bitmap(logoUrl) 
       .subscribe(
         bitmap -> { 
          holder.siteLogo.setImageBitmap(bitmap); 
          holder.siteLogo.setVisibility(View.VISIBLE); 
         }, 
         error -> { 
          holder.siteName.setVisibility(View.VISIBLE); 
         }); 
     compositeSubscription.add(holder.subscription); 
    } 

    @Override 
    public void onDetachedFromRecyclerView(RecyclerView recyclerView) { 
     compositeSubscription.unsubscribe(); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     public Subscription subscription; 

     // some holder-related stuff 

     public ViewHolder(View itemView) { 
      super(itemView); 
      // init holder 
     } 
    } 
} 
+0

fresco, quindi non esiste un metodo su adattatore che viene chiamato quando 'RecyclerView' è staccato dall'attività –

+0

Bene ... in realtà ce n'è uno - 'onDetachedFromRecyclerView' e potrebbe fare facilmente ciò che il' recycle() 'fa attualmente. Buona idea :) –

+0

Lasciatemi aggiornare la risposta. :) –