
怎么更好地使用RecyclerView
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
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:李浩
链接: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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询