图片加载-OnScrollListener中的方法没有执行

问题描述

OnScrollListener中的方法没有执行
  给一个girdview设置一个自定义的ArrayAdapter,该适配器同时实现了OnScrollListener接口,但是OnScrollListener中的onScroll() 以及在滑动gridview的时候onScrollStateChanged()都没有执行,自定义的ArrayAdapter中的geiView()执行正常,这段代码主要是现实从SD卡读取图片并显示在gridview中,代码如下:
        public class PhotoGalleryFragment extends Fragment {

private static final String TAG = "PhotoGalleryFragment";

private GridView mGridView;
private ArrayList<GalleryItem> mItems;
private PhotoLoader<ImageView> mPhotoLoader;
private int mFirstVisibleItem,mVisibleItemCount;
//用于判断是否是第一次打开应用,解决第一次进入应用,图片不加载的问题
private boolean mIsFirstIn = true;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    new FetchItemsTask().execute();
    //new FetchItemsTask().cancel();
    mPhotoLoader = new PhotoLoader<>(new Handler(),getActivity());
    mPhotoLoader.setmListener(new PhotoLoader.Listener<ImageView>() {
        @Override
        public void onPhotoLoadered(ImageView imageView, Bitmap bitmap) {
            if (isVisible()) imageView.setImageBitmap(bitmap);
        }
    });
    mPhotoLoader.start();
    mPhotoLoader.getLooper();
    Log.d(TAG, "backgrounp thread started");
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_photo_gallery,container,false);

    mGridView = (GridView) view.findViewById(R.id.gridView);

    setupAdapter();
    return view;
}

private class FetchItemsTask extends AsyncTask<Void,Void,ArrayList<GalleryItem>>{

    @Override
    protected ArrayList<GalleryItem> doInBackground(Void... params) {
        Log.d(TAG,"doInBackground");
        return new PhotosFetchr().fetchItems();
    }

    @Override
    protected void onPostExecute(ArrayList<GalleryItem> galleryItems) {
        mItems = galleryItems;
        setupAdapter();
        //GalleryItemAdapter adapter = (GalleryItemAdapter)mGridView.getAdapter();
        //adapter.notifyDataSetChanged();
    }
}

private void setupAdapter(){
    //Log.d(TAG,"mItems size = " +mItems.size());
    if(getActivity() == null || mGridView == null) return;
    if(mItems != null){
        mGridView.setAdapter(new GalleryItemAdapter(mItems));
    }else {
        mGridView.setAdapter(null);
    }
}

private class GalleryItemAdapter extends ArrayAdapter<GalleryItem> implements AbsListView.OnScrollListener{

    public GalleryItemAdapter(ArrayList<GalleryItem> mItems) {
        super(getActivity(), 0, mItems);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Log.d(TAG,"getView" );
        if(convertView == null){
            convertView = getActivity().getLayoutInflater().inflate(R.layout.gallery_item,parent,false);
        }
        ImageView imageView = (ImageView) convertView.findViewById(R.id.gallery_item_imageView);
        imageView.setImageResource(R.mipmap.icon1);
        GalleryItem item = getItem(position);
        imageView.setTag(item.getPhotoName());
        //mPhotoLoader.queueLoader(imageView,item.getPhotoName());
        return convertView;
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        Log.d(TAG,"onScrollStateChanged scrollState = " + scrollState );
        if(scrollState == SCROLL_STATE_IDLE){
            loadImage(mFirstVisibleItem,mVisibleItemCount);
        }else{
            mPhotoLoader.clearQueue();
        }

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        Log.d(TAG,"onScroll" +" firstVisibleItem = "+firstVisibleItem+" visibleItemCount = "+visibleItemCount);
        mFirstVisibleItem = firstVisibleItem;
        mVisibleItemCount = visibleItemCount;
        //首次进入时加载图片
        if(mIsFirstIn && visibleItemCount > 0){
            loadImage(mFirstVisibleItem,mVisibleItemCount);
            mIsFirstIn = false;

        }
    }
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    mPhotoLoader.clearQueue();
}

@Override
public void onDestroy(){
    super.onDestroy();
    mPhotoLoader.quit();
    Log.d(TAG, "backgrounp thread destroyed");
}

public void loadImage(int firstVisibleItem,int visibleItemCount){
    Log.d(TAG,"loadImage");
    for(int i =firstVisibleItem;i<firstVisibleItem + visibleItemCount;i++){
        String photoName = mItems.get(i).getPhotoName();
        ImageView imageView = (ImageView) mGridView.findViewWithTag(photoName);
        mPhotoLoader.queueLoader(imageView,photoName);
    }
}

}





解决方案

你应该给listview设置监听器,你只说给它设置了适配器。mGridView.setOnScrollListener(new GalleryItemAdapter(mItems));
为什么用适配器实现监听接口?

解决方案二:

Silverlight 中 OnApplyTemplate方法没有执行

时间: 2024-10-27 05:47:38

图片加载-OnScrollListener中的方法没有执行的相关文章

Android图片加载利器之Picasso基本用法

今天开始我们来学习一下Picasso,计划包括以下几方面的内容: 图片加载利器之Picasso进阶 图片加载利器之Picasso源码解析 目前市场上比较流行的图片加载框架主要有UniversalImageLoader,Picasso,Glide,Fresco. 下面简单介绍一下这几个框架: UniversalImageLoader:这个可以说是非常非常经典的一个了,相信每个app的开发人员都使用过,只可惜作者已经停止该项目的维护了,所以不太推荐使用. Picasso:是Square公司出品的图片

IOS中UIWebView加载Loading的实现方法

  最近有朋友问我类似微信语音播放的喇叭动画和界面图片加载loading界面是怎样实现的,是不是就是一个gif图片呢!我的回答当然是否定了,当然不排除也有人用gif图片啊! 第一种方法:使用UIView and UIActivityIndicatorView 代码如下: //创建UIWebView WebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 44, 320, 400)]; [WebView setUserInteraction

watchOS中进行异步图片加载和缓存的策略

watchOS中进行异步图片加载和缓存的策略 一.引言         iWatch是智能手表的一次革命.iWatch的应用也将会越来越多,基于watch的一些特点,watchOS的开发者需要更加精益的把握watch的UI和性能.运用watchOS自带的缓存体系进行数据的缓存,是增强用户体验度的一种方式,这篇博客,介绍在watchOS中进行异步加载图片和缓存的方法,愿与志同道合的朋友,一起交流. 关于watchOS中的缓存框架,在这里:http://my.oschina.net/u/234088

深入剖析Android的Volley库中的图片加载功能_Android

一.基本使用要点回顾 Volley框架在请求网络图片方面也做了很多工作,提供了好几种方法.本文介绍使用ImageLoader来进行网络图片的加载. ImageLoader的内部使用ImageRequest来实现,它的构造器可以传入一个ImageCache缓存形参,实现了图片缓存的功能,同时还可以过滤重复链接,避免重复发送请求. 下面是ImageLoader加载图片的实现方法: public void displayImg(View view){ ImageView imageView = (Im

关于图片的预加载过程中隐藏未知的_javascript技巧

看完了曼联与曼城的同城德比,还有漫长的两个小时,才能看到期待中的国家德比.无聊的很,左右无事,便来论坛闲逛.看到了一章关于图片预加载的博文,其代码如下: 复制代码 代码如下: function loadImage(url, callback) { var img = new Image(); //创建一个Image对象,实现图片的预下载 img.src = url; if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数 callback(img); ret

js判断图片加载完成后获取图片实际宽高的方法_javascript技巧

本文实例讲述了js判断图片加载完成后获取图片实际宽高的方法.分享给大家供大家参考,具体如下: 通常,我们会用jq的.width()/.height()方法获取图片的宽度/高度或者用js的.offsetwidth/.offsetheight方法来获取图片的宽度/高度,但这些方法在我们通过样式设置了图片的宽高后获取的就不是图片的实际宽高,这显然在有些时候不是我们想要的结果,那么有没有一种方法来获取这样的实际宽高呢?答案是有的.下面的代码就能解决这样的问题: <img src="01.jpg&q

jQuery实现图片加载完成后改变图片大小的方法_jquery

本文实例讲述了jQuery实现图片加载完成后改变图片大小的方法.分享给大家供大家参考,具体如下: 要改变图片的大小并不难,可以用jQuery操作css改变.但是前提是要判断图片是否加载完成.主要是通过jQuery的load事件和onreadystatechange来判断其状态. 对于IE6,用onreadystatechange可以直接处理,在IE7中,则需要用定时器来判断图片的readystate状态.而对于FF和Chrome刚可以直接用load事件来判断. 以下是在实例中使用的完整代码: <

Javascript实现图片加载从模糊到清晰显示的方法_javascript技巧

1.背景介绍 在网络相册应用中用户查看照片是最朴素的需求,当网络比较慢的时候查看照片等待的时间是比较长的,用户体验会很差. 2.现状 现在加载照片的方法主要有一下两种: (1)最原始的方式在html页面直接用img标签加载显示照片.该方法在网络速度比较慢或者要显示的照片比较大的时候会页面出现空白的等待过程,并且不能开始给用户看到照片大概的情况,用户体验比较不好 (2)在html页面先用img标签加载显示照片的缩略图,同时用javascript隐藏的加载照片的原图,等照片大图加载完成后再将原图显示

深入剖析Android的Volley库中的图片加载功能

一.基本使用要点回顾 Volley框架在请求网络图片方面也做了很多工作,提供了好几种方法.本文介绍使用ImageLoader来进行网络图片的加载. ImageLoader的内部使用ImageRequest来实现,它的构造器可以传入一个ImageCache缓存形参,实现了图片缓存的功能,同时还可以过滤重复链接,避免重复发送请求. 下面是ImageLoader加载图片的实现方法: public void displayImg(View view){ ImageView imageView = (Im