6

Sto usando nested RecyclerView. Mezzi all'interno di un RecyclerView verticale Ho più vista orizzontale del riciclatoreIntervallo di riclassificazione annidato mentre i primi scorrono per poi scorrere senza problemi?

Sto collegando l'adattatore a recylerviews orizzontali all'interno del metodo BindViewHolder di padre RecyclerView come segue.

@Override 
public void onBindViewHolder(final MainViewHolder holder, final int position) { 
    switch (holder.getItemViewType()) { 
     case TYPE_PRODUCT: 
      ((ListHolderProduct) holder).itemTitle.setText(browseCategoryHomePageItems.get(position).displayName.toUpperCase()); 
      ((ListHolderProduct) holder).recyclerView.setAdapter(new CarouselProductsRecyclerAdapter(context 
        , browseCategoryHomePageItems.get(position).products 
        , R.layout.activity_categoryhome_products_grid_item 
        , nestedRecyclerItemClickedListener 
        , position)); 
      break; 
     case TYPE_DEAL: 
      ((ListHolderDeal) holder).itemTitle.setText(browseCategoryHomePageItems.get(position).displayName.toUpperCase()); 
      ((ListHolderDeal) holder).recyclerView.setAdapter(new CarouselDealsRecyclerAdapter(context 
        , browseCategoryHomePageItems.get(position).dealItems 
        , R.layout.activity_categoryhome_deals_grid_item 
        , nestedRecyclerItemClickedListener 
        , position)); 
      break; 
      //few more types like this 
    } 
} 

Ora ogni volta che scorrere la pagina si è in ritardo un po 'dal momento che vi allego adattatore per RecyclerView orizzontale su OnBindViewHolder

E non ci può essere N Numero di TYPE_PRODUCT o qualsiasi tipo di elenchi orizzontali. Significa che possono esserci più liste orizzontali dello stesso tipo.

Qualche idea su come ottimizzare questa cosa e migliorare la velocità di scorrimento.

È in ritardo poiché setAdapter viene chiamato ogni volta per l'elenco in precedenza.

Aggiornamento su questo sto ampliando LinearLayoutManager e in quanto sto impostando lo spazio extraLayout che ha risolto il mio problema ma non so che questo è giusto o no, sto impostando uno spazio extra come di seguito.

layoutManager.setExtraLayoutSpace(2 * this.getResources().getDisplayMetrics().heightPixels); 

e follwoing è layout personalizzato classe dirigente

public class PreCachingLayoutManager extends LinearLayoutManager { 
private static final int DEFAULT_EXTRA_LAYOUT_SPACE = 600; 
private int extraLayoutSpace = -1; 
private Context context; 

public PreCachingLayoutManager(Context context) { 
    super(context); 
    this.context = context; 
} 

public PreCachingLayoutManager(Context context, int extraLayoutSpace) { 
    super(context); 
    this.context = context; 
    this.extraLayoutSpace = extraLayoutSpace; 
} 

public PreCachingLayoutManager(Context context, int orientation, boolean reverseLayout) { 
    super(context, orientation, reverseLayout); 
    this.context = context; 
} 

public void setExtraLayoutSpace(int extraLayoutSpace) { 
    this.extraLayoutSpace = extraLayoutSpace; 
} 

@Override 
protected int getExtraLayoutSpace(RecyclerView.State state) { 
    if (extraLayoutSpace > 0) { 
     return extraLayoutSpace; 
    } 
    return DEFAULT_EXTRA_LAYOUT_SPACE; 
} 

}

+0

controllo questo http://stackoverflow.com/questions/26649406/nested-recycler-view-height-doesnt-wrap-its-content –

+3

senza la mia domanda diversa Sto affrontando ritardo mentre scorrimento – apk

+0

Grazie per la soluzione con getExtraLayoutSpace! Non ho trovato una soluzione migliore, ma aggiungo un miglioramento: restituisco lo spazio extra solo la prima volta e restituisco zero negli altri casi. – Anton

risposta

1

ho avuto lo stesso problema con lo scorrimento, a causa di caricare le immagini durante lo scorrimento. Quindi è necessario utilizzare la libreria Picasso per caricare le immagini e rendere pause_tag se si utilizza onScrollListener.

Nella tua onBindViewHolder Picasso.with (contesto) .load (foodData.getRecipe_resize_image_url()) .resize (larghezza, altezza) .placeholder (R.drawable.empty_image) .tag ("resume_tag") .into (mainViewHolder.food_picture);

Nella tua onScrollListener

@Override 
public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
    super.onScrollStateChanged(recyclerView, newState); 
    final Picasso picasso = Picasso.with(context); 
    if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
     picasso.resumeTag("resume_tag"); 
    } else { 
     picasso.pauseTag("resume_tag"); 
    } 

} 
+0

Ho già implementato questo la mia domanda è diversa – apk

2

non creano orizzontale adapter ogni volta che in onBindViewHolder, invece in ogni classe di ViewHolder (ListHolderDeal, ListHolderProduct) creare adattatore appropriato. quindi in onBindViewHolder di verticale Recyclerview basta sostituire i dati di quell'adattatore e se la dose orizzontale RecyclerView non ha un adattatore impostato con l'adattatore viewholder. se la dose, sostituire il set di dati di quello adapter e chiamare notifyDataSetChange. Con questo approccio è possibile utilizzare il pool di adattatori in modo implicito in modo che il GC possa infastidire meno.

Spero che aiuti.

+0

okay, quindi vuoi che io abbia una variabile dell'adattatore nel viewholder stesso e poi aggiorni semplicemente inBindViewHolder giusto? – apk

+0

sì, perché non vogliamo creare oggetti non necessari. –

+0

okay fammi provare – apk

0

Si prega di verificare se avete overrided getItemViewType(int position) metodo, se non si prega di ignorare questo metodo e dire come molti tipi di vista il vostro recyclerview sta per gestire, dal codice di cui sopra ci sono due tipi di vista uno per TYPE_PRODUCT e altro per TYPE_DEAL .

Questo particolare metodo, se sovrascritto, restituisce correttamente il conteggio dei tipi, impedisce l'inflazione non desiderata del layout per la vista tipizzata già disponibile (nella cache del recycler) che aumenta drasticamente le prestazioni.

Ad esempio l'implementazione di una panoramica con più caratteri, please refer this.

Riferimento: http://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html#getItemViewType%28int%29

Spero che questo aiuti !!! Per favore fatemi sapere se avete problemi con esso. Grazie.