有了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
类,并正确重用convertView
。 RecyclerView
默认提供这些优化,因此您不必再这样做了。
【讨论】:
啊啊啊啊啊! 我非常怀疑性能是否会提高 如果您已经以正确的方式实现了 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,毕加索还需要吗?的主要内容,如果未能解决你的问题,请参考以下文章