怎么更好地使用RecyclerView

 我来答
星月小木木
2015-12-25 · TA获得超过3.2万个赞
知道大有可为答主
回答量:2.4万
采纳率:0%
帮助的人:1.1亿
展开全部
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:李浩
链接:http://www.zhihu.com/question/33617371/answer/57242980
来源:知乎

ListView涉及接口

public static interface AbsListView.OnScrollListener {
void onScrollStateChanged(AbsListView view, int scrollState);
void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount);
}

RecyclerView涉及类

public static abstract class RecyclerView.OnScrollListener {
void onScrollStateChanged(RecyclerView recyclerView, int newState);
void onScrolled(RecyclerView recyclerView, int dx, int dy);
}

这两个OnScrollListener都可以通过onScrollStateChanged判断当前滑动状态,当状态为SCROLL_STATE_IDLE时才加载图片,其他时候不加载。
但二者的onScroll方法的参数不一样。ListView可以直接得到可见的item,然后加载里面的图片就可以了。对于RecyclerView,我能想到的办法就是在Adapter里自己维护一个Set<ImageView>来记录需要加载图片的ImageView,当滑动停止时,遍历这个Set加载里面的图片。

Adapter部分代码:

// 假设holder里有成员ImageView iv

private Set<ImageView> imageSet = new HashSet<ImageView>;

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

// 把需要加载图片的ImageView记录下来
imageSet.add(holder.iv);

// do something else
}

@Override
public void onViewRecycled(ViewHolder holder) {
// recycle的时候,从imageSet里删除相应的ImageView
// 否则会影响GC,特别是在用到分页加载的时候
imageSet.remove(holder.iv);
}

OnScrollListener部分代码:

@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == SCROLL_STATE_IDLE) {
for (ImageView imageView : imageSet) {
// TODO 加载imageView里的图片
}
}
}

最后调用RecyclerView.addOnScrollListener为RecyclerView设置listener就可以了。

其他加载图片的具体业务与ListView里相同,可能要用到setTag(),getTag()之类的操作。

只是自己想到的方法,有不妥的地方欢迎指正XD
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式