使用RecyclerView,是否仍需要Picasso?

5

最近我从iOS转换过来,我意识到要处理数百张大图片的快速滚动是相当费力的,实际上你需要使用Picasso(或者可能是Volley)。

现在有了RecyclerView - 是否有人使用RecyclerView实现了许多大图片的滚动

如果有的话,是否仍需要像以前一样使用Picasso(即上周)?

对此有什么发现吗? 干杯


6
鉴于RecyclerView仅在AAR格式中提供并且已经发布约48小时,因此大多数开发人员目前无法使用它,因此使用过RecyclerView的人很少。另外,RecyclerView不会异步下载和准备图像供使用,而Picasso可以做到这一点。具体而言,您期望RecyclerView做些什么以消除对Picasso的需求? - CommonsWare
嗨CW...此外,RecyclerView不会异步下载图像并为其使用做准备。你知道的,这正是我真正想问的:据我所知,RecyclerView是Android改进列表视图的方式,以便我们可以更流畅地滚动大量大型图像的列表,"更像iOS"。我想知道它的整个重点是否在于回收图像(如果它所做的只是让您剥离单元格并重新加载它-那有点无聊)。因此,我想知道这个新的R.V.如何影响我们当前的典型工作流程! - Fattie
2个回答

24

RecyclerViewAbsListView类的改进版本,更具模块化和可扩展性。它提供了更好的API来回收视图,并提供了一种使用相同API创建各种列表视图的方法——垂直、水平、网格、错列网格等等。加载图片完全不属于此API的范畴。

因此,将图片加载到其中需要您做与以前完全相同的事情。例如,使用Picasso:

@Override
public void onBindViewHolder(final MyViewHolder myViewHolder, final int i) {
    Picasso.withContext(mContext).load(myImageUrl).into(myViewHolder.imageView);
}

实际上,回到你的观点:

RecyclerView 是 Android 改进列表视图的方式,可以更加流畅地滚动大量大型图像列表。

如果你已经正确地使用了 ViewHolder 类和适当地重复使用了 convertView,那么我极为怀疑性能会有所提高。而 RecyclerView 默认提供了这些优化,所以你不再需要自行处理。


1
啊啊啊啊啊啊啊啊!我非常怀疑性能会提高 如果你已经以正确的方式实现了ListAdapter...有趣,Niek,谢谢!你说到了点子上。从某种意义上说,我想这才是我真正想问的,“新的RecyclerView只是对每个人都必须使用的列表视图的'最佳方式'进行规范化,还是另外一种东西......”谢谢! - Fattie
确实。他们可能在幕后进行了一些优化,这可能会稍微提高性能,但我认为这不如使用ViewHolder和重用convertView提供的优化显著。毕竟,这是一个全新编写的类。 - nhaarman
4
如果这是正确答案,你应该标记为正确答案。 - Gil Moshayof
2
在这种情况下,Picasso会像早期的ListView适配器一样负责取消请求吗?还是我们应该在onViewRecycled(ViewHolder holder)中自己处理它? - Anamoy
1
@Joe 我原本以为我的列表和网格视图已经实现得“正确无误”,但是使用RecyclerView后,我的性能得到了很大的提升。 - Frank

0

是的,正如之前的评论所提到的那样,它仍然是必需的,但这也有助于。

import android.support.v7.widget.RecyclerView;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.scrolling.PicassoFlingScrollListener;


/**
 * Example Use:
 *     mRecyclerView.setOnScrollListener(new PicassoRecyclerViewScrollListener(mPicasso));
 * 
 * @author Simon Lightfoot <simon@demondevelopers.com>
 * 
 */
public static class PicassoRecyclerViewScrollListener implements RecyclerView.OnScrollListener
{
    private final PicassoFlingScrollListener    mListener;
    private final RecyclerView.OnScrollListener mDelegate;


    public PicassoRecyclerViewScrollListener(Picasso picasso)
    {
        this(picasso, null);
    }

    public PicassoRecyclerViewScrollListener(Picasso picasso, RecyclerView.OnScrollListener delegate)
    {
        mListener = new PicassoFlingScrollListener(picasso);
        mDelegate = delegate;
    }

    @Override
    public void onScrollStateChanged(int newState)
    {
        mListener.onScrollStateChanged(null, newState);
        if(mDelegate != null){
            mDelegate.onScrollStateChanged(newState);
        }
    }

    @Override
    public void onScrolled(int dx, int dy)
    {
        if(mDelegate != null){
            mDelegate.onScrolled(dx, dy);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接