有了RecyclerView,毕加索还需要吗?

Posted

技术标签:

【中文标题】有了RecyclerView,毕加索还需要吗?【英文标题】:With RecyclerView, is Picasso still necessary? 【发布时间】:2014-08-19 16:16:18 【问题描述】:

最近从 ios 迁移过来,我意识到要处理 100 多个大图像的快速滚动,

这是一项相当多的工作,实际上您需要使用 Picasso(或者可能是 Volley)。

现在 RecyclerView 出现了 - 有没有人使用 RecyclerView 实现了许多大图像的滚动

如果是这样,您是否必须像过去那样使用毕加索(即上周)

对此有何发现?干杯

【问题讨论】:

考虑到RecyclerView 已经使用了约48 小时,目前大多数开发者都无法使用(它只是AAR 格式),你会发现很少有人使用它。此外,RecyclerView 不会异步下载图像并准备使用,这是毕加索所做的。你具体期望RecyclerView 做什么来消除对毕加索的需求? 嗨 CW ... “此外,RecyclerView 不会异步下载图像并准备它们以供使用” ...你知道,这正是我真正要问的:作为我理解,RecyclerView 是 android 改进的列表视图,这样我们可以更流畅地滚动大图像的大列表,“更像在 iOS 上”。我想知道它的全部意义是否在于它回收的图像(如果它所做的只是让您剥离单元格并再次加载它 - 这有点打哈欠)。所以,我想知道这个新的 R.V.影响我们当前的典型工作流程! 【参考方案1】:

RecyclerView 只不过是AbsListView 类的改进、更模块化和可扩展的版本。它为回收视图提供了更好的 API,并提供了一种使用相同 API 创建各种列表视图的方法 - 垂直、水平、网格、交错网格等。加载图像根本不是这个 API 的一部分。

因此,将图像加载到其中需要您执行与以前完全相同的操作。例如,使用毕加索:

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


事实上,回到你的观点:

RecyclerView 是 Android 改进的列表视图,让我们可以更流畅地滚动大图列表

如果您已经以正确的方式实现了ListAdapter,我非常怀疑性能是否会提高:使用ViewHolder 类,并正确重用convertViewRecyclerView 默认提供这些优化,因此您不必再这样做了。

【讨论】:

啊啊啊啊啊! 我非常怀疑性能是否会提高 如果您已经以正确的方式实现了 ListAdapter ...令人着迷,Niek,谢谢!你一针见血。在某种程度上,这就是我真正想问的,我想。 “新的 RecyclerView 是不是每个人都必须使用的列表视图的‘最佳方式’的形式化,还是又是别的东西......”谢谢! 确实如此。他们可能在后台进行了一些优化,这可能会稍微提高性能,但我认为这不如ViewHolder 和重用convertView 提供的优化那么重要。毕竟,这是一个从头开始编写的新课程。 如果这是正确答案,你应该标记为正确答案。 在这种情况下,Picasso 会像早期的 ListView 适配器一样负责取消请求吗?还是我们应该在 onViewRecycled(ViewHolder holder) 中处理它? @Joe 我认为我的列表和网格视图以“正确的方式”实现,但回收视图仍然大大提高了我的性能。【参考方案2】:

是的,正如之前的 cmets 所提到的,它仍然需要,但这也有帮助。

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);
        
    

【讨论】:

以上是关于有了RecyclerView,毕加索还需要吗?的主要内容,如果未能解决你的问题,请参考以下文章

pimio钢笔 是毕加索钢笔吗

RecyclerView:错误的滚动效果(Android)

毕加索可以为我排队吗?

在 RecyclerView 中的单元格之间添加空间? [复制]

使毕加索中的缓存无效

RecyclerView | 处理 RecyclerView 中的点击事件