您的位置:首页 > 其它

提高ListView滚动的高效优化

2015-11-19 15:26 197 查看
【ListView伴随着网络加载,怎么能提高效率?】

拖动时通常加载数据,滑动的同时去加载,有时候会让设备出现卡顿

以网络加载图片为例

  解决方案:

1. ListView 滑动停止后才加载可见项

2. ListView滑动时,取消所有加载项

实现:

修改自定义适配器

1. 实现接口
public class NewsAdapter extends BaseAdapter implements AbsListView.OnScrollListener{


 
2. 实现两个方法
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_IDLE){
//加载可见项
mImageLoader.loadImages(mStart, mEnd);
}else {
//停止任务
mImageLoader.cancelAllTasks();
}
}

将加载图片的控制权从getView到onScrollStateChanged
      滚动时候停止加载,停止时加载

3. 注册接口
//注册接口,给传入的ListView绑定一个监听事件
listView.setOnScrollListener(this);


4.实现之后还有一个问题,就是首次进入时不会加载,可以增加一个flag去判断是否为第一个启动
   
a.添加一个变量  
private boolean mFirstIn;

b.初始化的时候赋值(红色标注)
 public NewsAdapter(Context context, List<NewsBean> data, ListView listView){
mList = data;
mInflater = LayoutInflater.from(context);
mImageLoader = new ImageLoader(listView);
URLS = new String[data.size()];
//保存当前我们获取到的所有的图片的Url
for (int i=0; i<data.size(); i++){
URLS[i] = data.get(i).newsIconUrl;
}
<span style="color:#ff0000;">mFirstIn = true;</span>
//注册接口,给传入的ListView绑定一个监听事件 listView.setOnScrollListener(this);
}

c.在onScroll进行判断  (在每次启动时,并不会调用onScrollStateChanged方法 ,
而onScroll方法都会首先调用,所以可以在onScroll方法进行判断)
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
mStart = firstVisibleItem;
mEnd = firstVisibleItem + visibleItemCount;

<span style="color:#ff0000;">if (mFirstIn && visibleItemCount>0){
mImageLoader.loadImages(mStart, mEnd);
mFirstIn = false;
}</span>
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: