使用MultiColumnPullToRefreshListView实现瀑布流加载网络图片

来源:互联网 发布:平板windows系统怎么样 编辑:程序博客网 时间:2024/04/30 01:24
 

[置顶] 使用MultiColumnPullToRefreshListView实现瀑布流加载网络图片

 3011人阅读 评论(3) 收藏 举报
 分类:

一、效果图如下


二、关键代码讲解

本例参考别人写的一个demo,这里写上个人的理解,方便日后使用方便

1、准备工作

第三方框架:universal-image-loader-1.8.6.jar,复制到libs中

第三方引用library:MultiColumnListView_HUEWU

2、配置文件

添加联网权限

3、初始化图片加载库

这里引用了universal-image-loader-1.8.6.jar,但是具体使用之前,还需要进行初始化工作,初始化工作可以在Application类中进行,也可以在第一个Activity中进行,一般习惯于在Application类中进行

初始化主要有三个步骤:

1)初始化ImageLoaderConfiguration

[java] view plain copy
  1. File cacheDir = StorageUtils.getOwnCacheDirectory(context, "topnews/Cache");//获取到缓存的目录地址  
  2. ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)  
  3.                 .memoryCacheExtraOptions(480800// max width, max height,即保存的每个缓存文件的最大长宽  
  4.                 //.discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) // Can slow ImageLoader, use it carefully (Better don't use it)设置缓存的详细信息,最好不要设置这个  
  5.                 .threadPoolSize(3)//线程池内加载的数量  
  6.                 .threadPriority(Thread.NORM_PRIORITY - 2)  
  7.                 .denyCacheImageMultipleSizesInMemory()  
  8.                 //.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation你可以通过自己的内存缓存实现  
  9.                 .memoryCacheSize(2 * 1024 * 1024)  
  10.                 .discCacheSize(50 * 1024 * 1024)  
  11.                 .discCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密  
  12.                 .discCacheFileNameGenerator(new HashCodeFileNameGenerator())//将保存的时候的URI名称用HASHCODE加密  
  13.                 .tasksProcessingOrder(QueueProcessingType.LIFO)  
  14.                 .discCacheFileCount(100//缓存的File数量  
  15.                 .discCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径  
  16.                 .defaultDisplayImageOptions(DisplayImageOptions.createSimple())  
  17.                 .imageDownloader(new BaseImageDownloader(context, 5 * 100030 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间  
  18.                 .writeDebugLogs() // Remove for release app  
  19.                 .build();  

2)初始化DisplayImageOptions

[java] view plain copy
  1. DisplayImageOptions options = new DisplayImageOptions.Builder()  
  2.                 // // 设置图片在下载期间显示的图片  
  3.                 .showImageOnLoading(R.drawable.empty_photo2)  
  4.                 // // 设置图片Uri为空或是错误的时候显示的图片  
  5.                 .showImageForEmptyUri(R.drawable.empty_photo2)  
  6.                 // // 设置图片加载/解码过程中错误时候显示的图片  
  7.                 .showImageOnFail(R.drawable.empty_photo2).cacheInMemory(true)  
  8.                 // 设置下载的图片是否缓存在内存中  
  9.                 .cacheOnDisc(true)  
  10.                 // 设置下载的图片是否缓存在SD卡中  
  11.                 .considerExifParams(true).imageScaleType(ImageScaleType.EXACTLY_STRETCHED)// 设置图片以如何的编码方式显示  
  12.                 .bitmapConfig(Bitmap.Config.RGB_565)// 设置图片的解码类型  
  13.                 // .decodingOptions(android.graphics.BitmapFactory.Options  
  14.                 // decodingOptions)//设置图片的解码配置  
  15.                 .considerExifParams(true)  
  16.                 // 设置图片下载前的延迟  
  17.                 .delayBeforeLoading(0)//int  
  18.                 // delayInMillis为你设置的延迟时间  
  19.                 // 设置图片加入缓存前,对bitmap进行设置  
  20.                 // 。preProcessor(BitmapProcessor preProcessor)  
  21.                 .resetViewBeforeLoading(true)// 设置图片在下载前是否重置,复位  
  22.                 .displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角,弧度为多少  
  23.                 .displayer(new FadeInBitmapDisplayer(100))// 淡入  
  24.                 .build();  

3)实例化ImageLoader

[html] view plain copy
  1. ImageLoader.getInstance().init(config);  
4、相关代码

activity_main.xml

[java] view plain copy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context=".MainActivity" >  
  6.   
  7.     <com.huewu.pla.lib.MultiColumnPullToRefreshListView  
  8.         android:id="@+id/list"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent"  
  11.        />  
  12.       
  13.       
  14. </RelativeLayout>  
如果不需要下拉刷新功能,可以使用MutiColumnListView

WaterfallAdapter.Java

[html] view plain copy
  1. package com.example.waterfalldemo.adapter;  
  2.   
  3.   
  4. import java.util.ArrayList;  
  5.   
  6. import android.content.Context;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.drawable.Drawable;  
  9. import android.util.Log;  
  10. import android.view.LayoutInflater;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.ImageView;  
  16. import android.widget.ProgressBar;  
  17. import android.widget.Toast;  
  18.   
  19. import com.example.waterfalldemo.R;  
  20. import com.nostra13.universalimageloader.core.ImageLoader;  
  21. import com.nostra13.universalimageloader.core.assist.FailReason;  
  22. import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;  
  23.   
  24.   
  25. public class WaterfallAdapter extends BaseAdapter {  
  26.   
  27.       
  28.     ArrayList<String> list;  
  29.     Context context;  
  30.     private Drawable drawable;  
  31.       
  32.     public WaterfallAdapter(ArrayList<String> list , Context context) {  
  33.         this.list = list;  
  34.         this.context = context;  
  35.         drawable = context.getResources().getDrawable(R.drawable.load_default);  
  36.     }  
  37.   
  38.   
  39.     @Override  
  40.     public int getCount() {  
  41.         return list != null ? list.size() : 0;  
  42.     }  
  43.   
  44.     @Override  
  45.     public Object getItem(int arg0) {  
  46.         return null;  
  47.     }  
  48.   
  49.     @Override  
  50.     public long getItemId(int arg0) {  
  51.         return 0;  
  52.     }  
  53.   
  54.     @Override  
  55.     public View getView(final int position, View view, ViewGroup group) {  
  56.         final Holder holder;  
  57.         // 得到View  
  58.         if (view == null) {  
  59.             holder = new Holder();  
  60.             LayoutInflater inflater = LayoutInflater.from(context);  
  61.             view = inflater.inflate(R.layout.image_item, null);  
  62.             holder.ivIcon = (ImageView) view.findViewById(R.id.row_icon);  
  63.             holder.pbLoad = (ProgressBar) view.findViewById(R.id.pb_load);  
  64.   
  65.             view.setTag(holder);  
  66.         } else {  
  67.             holder = (Holder) view.getTag();  
  68.         }  
  69.           
  70.         String url = list.get(position);  
  71.         ImageLoader.getInstance().displayImage(url, holder.ivIcon,  
  72.                 new ImageLoadingListener() {  
  73.                     @Override  
  74.                     public void onLoadingStarted(String imageUri, View view) {  
  75.                           
  76.                         //这儿初先初始化出来image所占的位置的大小,先把瀑布流固定住,这样瀑布流就不会因为图片加载出来后大小变化了  
  77.                         //LayoutParams lp = (LayoutParams) holder.ivIcon.getLayoutParams();  
  78.                         //多屏幕适配  
  79.                         //int dWidth = 480;  
  80.                         //int dHeight = 800;  
  81.                         //float wscale = dWidth / 480.0f;  
  82.                         //float hscale = dHeight / 800.0f;  
  83.                         //lp.height = (int) (yourImageHeight * hscale);  
  84.                         //lp.width = (int) (yourImageWidth * wscale);  
  85.                         //holder.ivIcon.setLayoutParams(lp);  
  86.                           
  87.                         holder.ivIcon.setImageDrawable(drawable);  
  88.                         holder.pbLoad.setVisibility(View.VISIBLE);  
  89.                     }  
  90.   
  91.                     @Override  
  92.                     public void onLoadingFailed(String imageUri, View view,  
  93.                             FailReason failReason) {  
  94.                         String message = null;  
  95.                         switch (failReason.getType()) {  
  96.                         case IO_ERROR:  
  97.                             message = "Input/Output error";  
  98.                             break;  
  99.                         case DECODING_ERROR:  
  100.                             message = "can not be decoding";  
  101.                             break;  
  102.                         case NETWORK_DENIED:  
  103.                             message = "Downloads are denied";  
  104.                             break;  
  105.                         case OUT_OF_MEMORY:  
  106.                             message = "内存不足";  
  107.                             Toast.makeText(context, message, Toast.LENGTH_SHORT)  
  108.                                     .show();  
  109.                             break;  
  110.                         case UNKNOWN:  
  111.                             message = "Unknown error";  
  112.                             Toast.makeText(context, message, Toast.LENGTH_SHORT)  
  113.                                     .show();  
  114.                             break;  
  115.                         }  
  116.                         holder.pbLoad.setVisibility(View.GONE);  
  117.                     }  
  118.   
  119.                     @Override  
  120.                     public void onLoadingComplete(String imageUri, View view,  
  121.                             Bitmap loadedImage) {  
  122.                         holder.pbLoad.setVisibility(View.GONE);  
  123.                     }  
  124.   
  125.                     @Override  
  126.                     public void onLoadingCancelled(String paramString,  
  127.                             View paramView) {  
  128.                     }  
  129.                 });  
  130.   
  131.           
  132.         holder.ivIcon.setOnClickListener(new OnClickListener() {  
  133.             @Override  
  134.             public void onClick(View view) {  
  135.                 // TODO Auto-generated method stub  
  136.                 Log.i("TAG", "image click");  
  137.             }  
  138.         });  
  139.           
  140.         return view;  
  141.     }  
  142.   
  143.   
  144.   
  145. }  
  146.   
  147. class Holder {  
  148.     public ImageView ivIcon;  
  149.     public ProgressBar pbLoad;  
  150. }  
MainActivity.java

[html] view plain copy
  1. package com.example.waterfalldemo;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.Activity;  
  6. import android.graphics.Bitmap;  
  7. import android.os.Bundle;  
  8.   
  9. import com.example.waterfalldemo.adapter.WaterfallAdapter;  
  10. import com.huewu.pla.lib.MultiColumnPullToRefreshListView;  
  11. import com.huewu.pla.lib.MultiColumnPullToRefreshListView.OnRefreshListener;  
  12. import com.nostra13.universalimageloader.cache.memory.impl.UsingFreqLimitedMemoryCache;  
  13. import com.nostra13.universalimageloader.core.DisplayImageOptions;  
  14. import com.nostra13.universalimageloader.core.ImageLoader;  
  15. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  16. import com.nostra13.universalimageloader.core.assist.ImageScaleType;  
  17. import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;  
  18.   
  19. public class MainActivity extends Activity {  
  20.       
  21.     private MultiColumnPullToRefreshListView waterfallView;//可以把它当成一个listView  
  22.     //如果不想用下拉刷新这个特性,只是瀑布流,可以用这个:MultiColumnListView 一样的用法  
  23.       
  24.     @Override  
  25.     protected void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.activity_main);  
  28.           
  29.          //初始化图片加载库  
  30.          DisplayImageOptions defaultOptions =  
  31.                     new DisplayImageOptions.Builder()  
  32.                         .cacheOnDisc(true)//图片存本地  
  33.                         .cacheInMemory(true)  
  34.                         .displayer(new FadeInBitmapDisplayer(50))  
  35.                         .bitmapConfig(Bitmap.Config.RGB_565)  
  36.                         .imageScaleType(ImageScaleType.EXACTLY) // default  
  37.                         .build();  
  38.                 ImageLoaderConfiguration config =  
  39.                     new ImageLoaderConfiguration.Builder(getApplicationContext())  
  40.                         .memoryCache(new UsingFreqLimitedMemoryCache(16 * 1024 * 1024))  
  41.                         .defaultDisplayImageOptions(defaultOptions).build();  
  42.                 ImageLoader.getInstance().init(config);  
  43.           
  44.         waterfallView = (MultiColumnPullToRefreshListView) findViewById(R.id.list);  
  45.           
  46.         ArrayList<String> imageList = new ArrayList<String>();  
  47.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043531502.jpg");  
  48.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043532264.jpg");  
  49.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043533581.jpg");  
  50.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043533571.jpg");  
  51.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043534672.jpg");  
  52.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043534854.jpg");  
  53.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043535929.jpg");  
  54.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043535784.jpg");  
  55.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043536626.jpg");  
  56.         imageList.add("http://www.yjz9.com/uploadfile/2012/1219/20121219043536244.jpg");  
  57.           
  58.         WaterfallAdapter adapter = new WaterfallAdapter(imageList, this);  
  59.         waterfallView.setAdapter(adapter);  
  60.         waterfallView.setOnRefreshListener(new OnRefreshListener() {  
  61.             @Override  
  62.             public void onRefresh() {  
  63.                 // TODO Auto-generated method stub  
  64.                 //下拉刷新要做的事  
  65.                   
  66.                 //刷新完成后记得调用这个  
  67.                 waterfallView.onRefreshComplete();  
  68.             }  
  69.         });  
  70.           
  71.     }  
  72.   
  73. }  

0 0
原创粉丝点击