2016-06-28 16 views
1

Ich versuche, ein Layout zu implementieren, das eine vertikale RecyclerView enthält, die mehrere horizontale RecyclerViews enthält (stellen Sie sich eine Nachrichtenwebsite mit mehreren Nachrichtenabschnitten vor, wo jeder Abschnitt mehrere Nachrichtengeschichten enthält, die horizontal gescrollt werden können) .RecyclerView von RecyclerViews: Image Loading

Die horizontale RecyclerView enthält (unter anderem) eine ImageView. Ich suche nach der optimalen Strategie, ein Bild von einer URL in dieses ImageView zu laden.

Erstens, mein Code. Der Adapter für die äußere RecyclerView:

@Override 
    public ItemRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.content_preview_list_item, null); 
     ItemRowHolder mh = new ItemRowHolder(v); 

     mh.recycler_view_list.setAdapter(new SectionListDataAdapter(mContext, listener, new ArrayList<ContentPreviewButtonItem>())); 
     mh.recycler_view_list.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); 
     return mh; 
    } 

    @Override 
    public void onBindViewHolder(ItemRowHolder itemRowHolder, int i) { 
     Log.d("RecyclerViewDataAdapter", "onBindViewHolder"); 
     final String sectionName = dataList.get(i).getTitle(); 

     ArrayList singleSectionItems = dataList.get(i).getItems(); 

     itemRowHolder.itemTitle.setText(sectionName); 
     ((SectionListDataAdapter)itemRowHolder.recycler_view_list.getAdapter()).setItemList(singleSectionItems); 
     itemRowHolder.recycler_view_list.getAdapter().notifyDataSetChanged(); 

     itemRowHolder.recycler_view_list.setHasFixedSize(true); 
    } 

Und für die innere RecyclerView, die die Bilder enthält:

@Override 
    public SingleItemRowHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     Log.d("SectionListDataAdapter", "onCreateViewHolder"); 
     View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.content_preview_item, null); 
     SingleItemRowHolder mh = new SingleItemRowHolder(v); 
     return mh; 
    } 

    @Override 
    public void onBindViewHolder(SingleItemRowHolder holder, int i) { 

     Log.d("SectionListDataAdapter", "onBindViewHolder"); 
     ContentPreviewButtonItem singleItem = itemsList.get(i); 

     Uri imageUri = Uri.parse(singleItem.getImageUrl()); 
     holder.itemImage.setImageURI(imageUri); //itemImage is a SimpleDraweeView 

    } 

Während dieser Code groß auf mobilen funktioniert, gibt es eine merkliche Verzögerung auf Tablette, wenn mehrere innere RecyclerViews und Bilder werden sofort geladen. Im Moment benutze ich die Fresco-Bibliothek von Facebook, um das Bild in eine SimpleDraweeView zu laden. Ich habe auch Picasso ausprobiert, aber das ergab eine OutOfMemoryException, wenn mehrere Bilder gleichzeitig geladen werden mussten. Ich verbesserte die Leistung, indem ich die Adapterkreation der inneren RecyclerViews in die onCreateViewHolder anstelle der onBindViewHolder verschiebe, aber die Verzögerung ist noch bemerkenswert.

Was ist die beste Strategie oder Bibliothek zum Laden von Bildern in diesem Szenario. Dank

+0

Glide anzeigen kann, ist eine perfekte Passform für das ich mit meinen die Sie können die Größe des Bildes auch ändern, während das Bild geladen wird, können Sie eine Miniaturansicht desselben anzeigen – silverFoxA

+0

Sie können das gleiche mit Picasso. Ich bin nicht sicher, ob ich eine Leistungsverbesserung von Glide erwarten kann. Oder gibt es einen Grund, warum Sie Glide statt Picasso, Fresco etc. empfehlen würden? – Androidicus

+0

Ich benutze Glide für eine lange Zeit jetzt und es ist Caching und große Bildverarbeitungsfähigkeit ist wirklich erstaunlich – silverFoxA

Antwort

0

Glide ist eine perfekte Passform für das ich mit glauben, was Sie auch die Größe des Bildes, während das Bild wird geladen Sie eine Miniaturansicht des gleichen