ListView优化使用imageLoader下载和缓存图片,图片异步加载,解决图片多了之后容易卡顿。

本文介绍了一种针对Android中ListView的优化方案,包括滑动时暂停图片加载、去除重复数据及使用SwipeRefreshLayout实现下拉刷新等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

马上要过年了,还有3天哦~

listView作为最常用的控件,对它的优化,真的是非常重要的,我也从网上找资料,真的是骗子特别多,复制粘贴的也特别多,各种转载,没有啥干货,于是自己写个demo纪念一下,兄弟们也帮我留言改进下,毕竟以后会用到的,感谢大家~

实现的效果图如下

这里写图片描述

使用imageLoader的滑动过程中不加载数据,停止滑动加载数据进行优化,点击界面进入网页Activity,适配网页。

同时可以动态改变欢迎界面,哈哈,上一次的代码被我用到这里来了。

用的资源地址是聚合数据的新闻头条数据,固定时间刷新数据,
使用android 原生的下拉刷新数据SwipeRefreshLayout,请求数据的。

好了,说说主要的吧


/**
 * 作者:朱亮 on 2017/1/24 16:00
 * 邮箱:171422696@qq.com
 *
 * @Description: ${新闻界面}(这里用一句话描述这个方法的作用)
 */

public class NewsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener{
    private SwipeRefreshLayout swipeRefreshView;
    private RelativeLayout bd_empty_view;
    private ListView listView;
    private NewsAdapter newsAdapter;
    private JSONArray jsonArray = null;
    private HashSet<String> hashSet ;
    private int startPos;
    private int endPos;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.newsfragment, container, false);//关联布局文件
        swipeRefreshView = (SwipeRefreshLayout) rootView.findViewById(R.id.swipeRefreshView);
        //设置刷新时动画的颜色,可以设置4个
        swipeRefreshView.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);
        swipeRefreshView.setOnRefreshListener(this);
        listView = (ListView) rootView.findViewById(R.id.newsListView);
        bd_empty_view = (RelativeLayout) rootView.findViewById(R.id.bd_empty_view);
        initAdapter();//初始化填充
        return rootView;
    }
    //设置Adapter
    private void initAdapter() {
        hashSet = new HashSet<>();
        jsonArray = new JSONArray();
        newsAdapter = new NewsAdapter(getContext());
        listView.setAdapter(newsAdapter);
        listView.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(),true,true));//这里设置的是ImageLoader的滑动监听
    }

    //下拉刷新时
    @Override
    public void onRefresh() {
        HttpManager.getNews(new GetCallBack(getContext()) {
            @Override
            public void onSuccessState(JSONObject result) {
                swipeRefreshView.setRefreshing(false);

                JSONArray arrays = result.getJSONObject("result").getJSONArray("data");
                for(int x = 0 ; x < arrays.size() ; x++){//去重复数据
                    if(!hashSet.contains(arrays.getJSONObject(x).getString("uniquekey"))){
                        hashSet.add(arrays.getJSONObject(x).getString("uniquekey"));
                        jsonArray.add(arrays.getJSONObject(x));
                    }
                }
                newsAdapter.setData(jsonArray);
            }

            @Override
            public void OnErrorFailure(String text) {
                swipeRefreshView.setRefreshing(false);
                Log.e("LOGS","获取失败  = " + text );
            }
        });
    }

    //当没有数据是,显示没有数据背景
    private void setEmptyBackground(){
        bd_empty_view.setVisibility(View.VISIBLE);
        listView.setEmptyView(bd_empty_view);
    }

}

主要的是这个

 listView.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(),true,true));//这里设置的是ImageLoader的滑动监听

和这个去除重复加载数据

JSONArray arrays = result.getJSONObject("result").getJSONArray("data");
                for(int x = 0 ; x < arrays.size() ; x++){//去重复数据
                    if(!hashSet.contains(arrays.getJSONObject(x).getString("uniquekey"))){
                        hashSet.add(arrays.getJSONObject(x).getString("uniquekey"));
                        jsonArray.add(arrays.getJSONObject(x));
                    }
                }
                newsAdapter.setData(jsonArray);

再看看Adapter 里面,里面用到了一个自定义类
MultiImageView,这个从网上找的,可一根据你传入图片的数量,自动换行和设置大小,还有一个工具类ViewHolder的使用。


@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null){
            convertView= LayoutInflater.from(mContext).inflate(R.layout.news_item,null);
        }
        RelativeLayout rela =  ViewHolder.get(convertView,R.id.rela);
        TextView newsTitle = ViewHolder.get(convertView,R.id.newsTitle);
        MultiImageView multiImageView = ViewHolder.get(convertView,R.id.multiImageView);
        TextView text_time = ViewHolder.get(convertView,R.id.text_time);
        TextView text_From = ViewHolder.get(convertView,R.id.text_From);


        newsTitle.setText(jsonArray.getJSONObject(position).getString("title"));
        text_time.setText(jsonArray.getJSONObject(position).getString("date"));
        text_From.setText(jsonArray.getJSONObject(position).getString("author_name"));

        ArrayList<String> list = new ArrayList<>();

        str[0] = jsonArray.getJSONObject(position).getString("thumbnail_pic_s");
        str[1] = jsonArray.getJSONObject(position).getString("thumbnail_pic_s02");
        str[2]  = jsonArray.getJSONObject(position).getString("thumbnail_pic_s03");
        for(int x = 0 ; x < str.length ; x ++){//将后台给的图片全部做成集合形式
            if(str[x] != null){
                list.add(str[x]);
            }
        }
        multiImageView.setList(list);//传递给自定义图片对象
        rela.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext ,WebActivity.class);
                intent.putExtra("url",jsonArray.getJSONObject(position).getString("url"));
                mContext.startActivity(intent);
            }
        });
        /**
         * 关注的状态
         */
        return convertView;
    }

最后在multiImageView里设置imageloader异步下载即可。


DisplayImageOptions girl_options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.no_loder)
                .showImageForEmptyUri(R.drawable.no_loder)
                .showImageOnFail(R.drawable.no_loder)
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .considerExifParams(true)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();

        try {
            //ImageLoader 开始异步加载图片
            ImageLoader.getInstance().loadImage(url, girl_options, new ImageLoadingListener() {
                @Override
                public void onLoadingStarted(String s, View view) {
                    imageView.setImageResource(R.drawable.anim_circle_128_0);//加载过程中显示
                }

                @Override
                public void onLoadingFailed(String s, View view, FailReason failReason) {
                    imageView.setImageResource(R.drawable.anim_circle_128_0);
                }

                @Override
                public void onLoadingComplete(String s, View view, Bitmap bitmap) {
                    imageView.setImageBitmap(bitmap);//图片下载完毕将图片设置进去
                }

                @Override
                public void onLoadingCancelled(String s, View view) {
                    imageView.setImageResource(R.drawable.default_ptr_rotate);//图片下载失败显示的图片
                }
            });
        }catch (OutOfMemoryError error) {
            error.printStackTrace();
        }

好了,完成。

最后看下数据缓存是不是缓存下来了,我从其他界面切回来,发现已经被缓存了

这里写图片描述

好了,关键几步就是这样,如果需要看源码的,

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值