6

Ich verwende verschachtelte RecyclerView. Mittel in einem vertikalen RecyclerView Ich habe mehrere horizontale Recycler-AnsichtVerschachtelte Recylerview-Verzögerung während der ersten Scroll-Vorgänge und dann reibungslos scrollt?

Ich bin Adapter zu horizontalen Recylerviews innerhalb onBindViewHolder Methode des übergeordneten RecyclerView anschließen wie folgt.

@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 
    } 
} 

Nun, wenn ich scrollen Seite es ein wenig hinkt, da ich Adapter horizontal RecyclerView auf OnBindViewHolder Befestigung am

Und kann es N Anzahl der TYPE_PRODUCT oder jede Art von horizontalen Listen sein. Bedeutet, dass es mehrere horizontale Listen desselben Typs geben kann.

Irgendeine Idee, wie ich dieses Ding optimieren und die Scrollgeschwindigkeit verbessern kann.

Es ist verzögert, da setAdapter jedes Mal für eine Liste zuvor aufgerufen wird.

Update hierzu Ich erweitere LinearLayoutManager und stelle extraLayout-Speicherplatz ein, der mein Problem behoben hat, aber ich weiß nicht, ob dies der richtige Weg ist oder nicht. Ich setze zusätzlichen Platz wie unten beschrieben.

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

und follwoing ist Manager benutzerdefinierte Layout-Klasse

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

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

+3

nicht meine Frage anders ich bin vor Verzögerung bei der Scroll- – apk

+0

Dank für Lösung mit getExtraLayoutSpace! Ich habe keine bessere Lösung gefunden, aber ich füge eine Verbesserung hinzu - ich gebe nur extra Raum zurück und gebe in anderen Fällen Null zurück. – Anton

Antwort

1

ich das gleiche Problem mit Scrollen hatte, weil der Laden von Bildern beim Scrollen. Sie müssen also Picasso Bibliothek zum Laden Ihrer Bilder verwenden und pause_tag machen, wenn Sie onScrollListener verwenden.

In Ihrem onBindViewHolder Picasso.with (Kontext) .load (foodData.getRecipe_resize_image_url()) .resize (Breite, Höhe) .placeholder (R.drawable.empty_image) .tag ("resume_tag") .into (mainViewHolder.food_picture);

In Ihrem 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

Ich habe dies bereits implementiert meine Frage ist anders – apk

2

Sie in onBindViewHolder, jedes Mal nicht schaffen horizontales adapter statt in jeder ViewHolder Klasse (ListHolderDeal, ListHolderProduct) entsprechende Adapter erstellen. dann in onBindViewHolder von vertikalen Recyclerview ersetzen Sie einfach die Daten dieses Adapters und wenn die horizontale RecyclerView Dosis keinen Adapter haben, stellen Sie es mit dem Viewholder-Adapter ein. Wenn es dosiert wird, ersetzen Sie den Datensatz dieser adapter und rufen Sie notifyDataSetChange. Bei diesem Ansatz können Sie den Adapterpool implizit verwenden, sodass Sie der GC möglicherweise weniger belästigt.

Ich hoffe es hilft.

+0

okay, so willst du mich Adapter Variable in Viewholder selbst haben und dann nur in OnBindViewHolder aktualisieren, oder? – apk

+0

ja, weil wir keine unnötigen Objekte erstellen wollen. –

+0

Okay, lass mich versuchen – apk

0

Bitte überprüfen Sie, ob Sie getItemViewType(int position) Methode overrided haben, wenn nicht bitte diese Methode überschreiben und sagen, wie viele Arten von Ansichten Ihre recyclerview, aus dem obigen Code gibt es zwei Arten von Ansicht, die eine für TYPE_PRODUCT und andere für TYPE_DEAL zu handhaben wird .

Diese spezielle Methode, wenn überschrieben und die Typenzahl korrekt zurückgibt, verhindert ungewolltes Aufblähen des Layouts für die bereits vorhandene typisierte Ansicht (im Recycler-Cache), was die Leistung drastisch erhöht.

Zum Beispiel der Implementierung von mehreren typisierten Recyclerview, please refer this.

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

hoffe, das hilft !!! Bitte lassen Sie mich wissen, wenn Sie irgendwelche Probleme damit haben. Vielen Dank. diese