RecyclerView+Glide+PhotoView

[java] view plain copy
  1. "font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">RecyclerView是谷歌最新的代替ListView和GridView一款超赞控件,可以随意变成ListView,GridView,和瀑布流的样式,也许是才出来不久,苦恼的是它的监听事件有点麻烦,需要自己动手重写方法,后面代码里会体现出来。Glide是一款高效图片处理的第三包,比较其他的图片处理第三方包要高效,好用很多,自己可以上网查查了解了解。PhotoView是一款支持放大缩小图片浏览的第三方包,用法都很简单。  

先看看效果图:

主界面的瀑布流照片墙:

RecyclerView+Glide+PhotoView_第1张图片

然后点击某一张图片,进入大图:

RecyclerView+Glide+PhotoView_第2张图片

然后两点手势缩放图片,最后点击图片,退回到原图

RecyclerView+Glide+PhotoView_第3张图片

activity代码:

[java] view plain copy
  1. public class RecyclerViewGridImageActivity extends Activity {  
  2.     private RecyclerView mRecyclerView;  
  3.     private MyRecyclerViewAdapter adapter;  
  4.     private String[] URLs = new String[]{  
  5.             "http://pic3.nipic.com/20090617/1242397_083514091_2.jpg",  
  6.             "http://pic28.nipic.com/20130422/12457151_164027506188_2.jpg",  
  7.             "http://pic4.nipic.com/20091120/805653_183746006558_2.jpg",  
  8.             "http://pic7.nipic.com/20100606/4899050_135353003843_2.jpg",  
  9.             "http://pic4.nipic.com/20091218/3557379_083034065299_2.jpg",  
  10.             "http://pic4.nipic.com/20090924/3308315_095324041734_2.jpg",  
  11.             "http://pica.nipic.com/2008-01-18/2008118212025258_2.jpg",  
  12.             "http://pica.nipic.com/2007-11-15/20071115103157516_2.jpg",  
  13.             "http://pic6.nipic.com/20100427/4365846_231110093316_2.jpg",  
  14.             "http://a2.att.hudong.com/79/22/01000000000000119062273272179.jpg",  
  15.             "http://img4.duitang.com/uploads/item/201209/20/20120920165508_EuenZ.jpeg",  
  16.             "http://img5.duitang.com/uploads/item/201207/25/20120725171947_CV3ZA.jpeg",  
  17.             "http://pic24.nipic.com/20121029/3822951_090444696000_2.jpg",  
  18.             "http://d.3987.com/lyzr_130620/004.jpg",  
  19.             "http://pic14.nipic.com/20110527/2531170_101932834000_2.jpg",  
  20.             "http://pica.nipic.com/2008-01-12/200811215275498_2.jpg",  
  21.             "http://pica.nipic.com/2007-07-15/200771515512480_2.jpg",  
  22.             "http://pic3.nipic.com/20090514/2639204_233912087_2.jpg",  
  23.             "http://img4.chinaface.com/original/212dlz514BUdSEyhs4mJrrPXe1a4E.jpg",  
  24.             "http://image.tianjimedia.com/uploadImages/2011/306/EQ2E3ZUPNMNV.jpg",  
  25.             "http://h.hiphotos.baidu.com/image/pic/item/0b55b319ebc4b7452c1b0e16cdfc1e178a821526.jpg",  
  26.             "http://a.hiphotos.baidu.com/image/pic/item/9f510fb30f2442a751a29476d543ad4bd01302b0.jpg",  
  27.             "http://e.hiphotos.baidu.com/image/pic/item/f2deb48f8c5494eec48c66ca29f5e0fe98257eb2.jpg",  
  28.             "http://f.hiphotos.baidu.com/image/pic/item/1e30e924b899a901f19c32e519950a7b0308f5bc.jpg",  
  29.             "http://e.hiphotos.baidu.com/image/pic/item/63d0f703918fa0eca4042edf229759ee3c6ddb25.jpg",  
  30.             "http://h.hiphotos.baidu.com/image/pic/item/a1ec08fa513d2697f631428f51fbb2fb4216d806.jpg",  
  31.             "http://b.hiphotos.baidu.com/image/pic/item/ac4bd11373f08202034236d14ffbfbedaa641b0f.jpg",  
  32.             "http://e.hiphotos.baidu.com/image/pic/item/58ee3d6d55fbb2fbafb52bfa4b4a20a44723dcb8.jpg",  
  33.             "http://a.hiphotos.baidu.com/image/pic/item/c8177f3e6709c93d08d97a679a3df8dcd1005472.jpg",  
  34.             "http://h.hiphotos.baidu.com/image/pic/item/bd3eb13533fa828b01fbafb2ff1f4134960a5a82.jpg",  
  35.             "http://b.hiphotos.baidu.com/image/pic/item/8326cffc1e178a82689d65adf403738da977e81e.jpg",  
  36.             "http://h.hiphotos.baidu.com/image/pic/item/9825bc315c6034a8d141851dce1349540823768e.jpg",  
  37.             "http://h.hiphotos.baidu.com/image/pic/item/72f082025aafa40f7c884d31af64034f79f0198b.jpg",  
  38.             "http://a.hiphotos.baidu.com/image/pic/item/d53f8794a4c27d1eaa8358171fd5ad6edcc438bf.jpg",  
  39.             "http://d.hiphotos.baidu.com/image/pic/item/902397dda144ad344a35e454d4a20cf430ad855e.jpg",  
  40.             "http://a.hiphotos.baidu.com/image/pic/item/728da9773912b31be0f04c498318367adab4e136.jpg",  
  41.             "http://d.hiphotos.baidu.com/image/pic/item/5bafa40f4bfbfbed88e0cfa07cf0f736aec31fb7.jpg",  
  42.             "http://c.hiphotos.baidu.com/image/pic/item/8d5494eef01f3a299fff02c79b25bc315c607c80.jpg",  
  43.             "http://pic7.nipic.com/20100522/1263764_002013845527_2.jpg",  
  44.             "http://a2.att.hudong.com/12/26/19300000362045133857269184471_950.jpg",  
  45.             "http://pic.nipic.com/2008-03-01/2008319174451_2.jpg",  
  46.             "http://pic23.nipic.com/20120824/8218020_193654254129_2.jpg",  
  47.             "http://pic24.nipic.com/20121010/4388163_025151474144_2.jpg",  
  48.             "http://pic11.nipic.com/20100803/4038389_093502059852_2.jpg",  
  49.             "http://d.3987.com/mlxw_130629/002.jpg",  
  50.             "http://pic.sayingfly.com/Photo/UpLoadFiles/2008-7-24/20087249442527.jpg",  
  51.             "http://pic12.nipic.com/20110223/2709576_111836168000_2.jpg",  
  52.             "http://pic14.nipic.com/20110609/2531170_055926229173_2.jpg",  
  53.             "http://d.3987.com/dgblcsyjgqbz_20130314/001.jpg",  
  54.             "http://pic.yesky.com/imagelist/06/47/985202_5664.jpg",  
  55.             "http://pic19.nipic.com/20120324/3484432_092618805000_2.jpg"  
  56.     };  
  57.   
  58.   
  59.     protected void onCreate(Bundle savedInstanceState) {  
  60.         super.onCreate(savedInstanceState);  
  61.         setContentView(R.layout.myrecyclerviw_layout);  
  62.         mRecyclerView = (RecyclerView) findViewById(R.id.myrecycler_layout);  
  63.         adapter = new MyRecyclerViewAdapter(this, URLs);  
  64.         mRecyclerView.setAdapter(adapter);  
  65.         //瀑布流样式,在adapter里要添加随机高度  
  66.         mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));  
  67.         mRecyclerView.addItemDecoration(new DividerGridItemDecoration(this));  
  68.         //GridView样式,在adapter中不要随机高度  
  69. //        mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));  
  70. //        mRecyclerView.addItemDecoration(new DividerGridItemDecoration(this));  
  71.         //ListView样式,在adapter中不要随机高度  
  72. //        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));  
  73. //        mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));  
  74.         // 设置item动画  
  75.         mRecyclerView.setItemAnimator(new DefaultItemAnimator());  
  76.   
  77.         adapter.setOnItemClickLitener(new MyRecyclerViewAdapter.OnItemClickLitener() {  
  78.             @Override  
  79.             public void onItemClick(View view, int position) {  
  80.                 Intent intent = new Intent(RecyclerViewGridImageActivity.this, ShowImageActivity.class);  
  81.                 String url = URLs[position];  
  82.                 intent.putExtra("URL", url);  
  83.                 startActivity(intent);  
  84.   
  85.             }  
  86.   
  87.             @Override  
  88.             public void onItemLongClick(View view, int position) {  
  89.                 Toast.makeText(RecyclerViewGridImageActivity.this"长按事件", Toast.LENGTH_SHORT).show();  
  90.             }  
  91.         });  
  92.   
  93.     }  
  94. }  
[java] view plain copy
  1.   
myrecyclerviw_layout:
[html] view plain copy
  1. xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical">  
  6.   
  7.     <android.support.v7.widget.RecyclerView  
  8.         android:id="@+id/myrecycler_layout"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="match_parent">  
  11.   
  12.     android.support.v7.widget.RecyclerView>  
  13. LinearLayout>  

Adapter代码:
[java] view plain copy
  1. public  class MyRecyclerViewAdapter extends RecyclerView.Adapter {  
  2.   
  3.     private String[] URLs;  
  4.     private LayoutInflater mInflater;  
  5.     private List mHeights;  
  6.     private Context mContext;  
  7.     public interface OnItemClickLitener  
  8.     {  
  9.         void onItemClick(View view, int position);  
  10.         void onItemLongClick(View view , int position);  
  11.     }  
  12.   
  13.     private OnItemClickLitener mOnItemClickLitener;  
  14.   
  15.     public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)  
  16.     {  
  17.         this.mOnItemClickLitener = mOnItemClickLitener;  
  18.     }  
  19.   
  20.   
  21.     public MyRecyclerViewAdapter(Context context, String[] urls) {  
  22.         URLs = urls;  
  23.         mContext = context;  
  24.         mInflater = LayoutInflater.from(context);  
  25.   
  26.         //设置随机高度  
  27.         mHeights = new ArrayList();  
  28.         for (int i = 0; i < URLs.length; i++) {  
  29.             mHeights.add((int) (100 + Math.random() * 300));  
  30.         }  
  31.     }  
  32.   
  33.     @Override  
  34.     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
  35.         MyViewHolder holder = new MyViewHolder(mInflater.inflate(  
  36.                 R.layout.recyclerview_item, parent, false));  
  37.         return holder;  
  38.     }  
  39.   
  40.     @Override  
  41.     public void onBindViewHolder(final MyViewHolder holder, final int position) {  
  42.         //设置随机高度  
  43.         ViewGroup.LayoutParams lp = holder.imageView.getLayoutParams();  
  44.         lp.height = mHeights.get(position);  
  45.         holder.imageView.setLayoutParams(lp);  
  46.   
  47.         Glide.with(mContext)  
  48.                 .load(URLs[position])  
  49.                 .centerCrop()  
  50.                 .placeholder(R.mipmap.ic_launcher)  
  51.                 .diskCacheStrategy(DiskCacheStrategy.ALL)  
  52.                 .into(holder.imageView);  
  53.   
  54.         // 如果设置了回调,则设置点击事件  
  55.         if (mOnItemClickLitener != null)  
  56.         {  
  57.             holder.itemView.setOnClickListener(new OnClickListener()  
  58.             {  
  59.                 @Override  
  60.                 public void onClick(View v)  
  61.                 {  
  62.                     int pos = holder.getLayoutPosition();  
  63.                     mOnItemClickLitener.onItemClick(holder.itemView, pos);  
  64.                 }  
  65.             });  
  66.   
  67.             holder.itemView.setOnLongClickListener(new OnLongClickListener()  
  68.             {  
  69.                 @Override  
  70.                 public boolean onLongClick(View v)  
  71.                 {  
  72.                     int pos = holder.getLayoutPosition();  
  73.                     mOnItemClickLitener.onItemLongClick(holder.itemView, pos);  
  74. //                    removeData(pos);  
  75.                     return false;  
  76.                 }  
  77.             });  
  78.         }  
  79.     }  
  80.   
  81.     @Override  
  82.     public int getItemCount() {  
  83.         return URLs.length;  
  84.     }  
  85.   
  86. //    public void addData(int position)  
  87. //    {  
  88. //        mDatas.add(position, "Insert One");  
  89. //        notifyItemInserted(position);  
  90. //    }  
  91. //  
  92. //  
  93.     public void removeData(int position)  
  94.     {  
  95. //        mDatas.remove(position);//List或ArrayList才有添加移除方法  
  96.   
  97.         notifyItemRemoved(position);  
  98.     }  
  99.   
  100.     class MyViewHolder extends ViewHolder {  
  101.   
  102.   
  103.         ImageView imageView;  
  104.   
  105.         public MyViewHolder(View view) {  
  106.             super(view);  
  107.             imageView = (ImageView) view.findViewById(R.id.id_num);  
  108.   
  109.         }  
  110.     }  
  111. }  
recyclerview_item:
[html] view plain copy
  1. xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_margin="3dp">  
  6.     <ImageView  
  7.         android:id="@+id/id_num"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:scaleType="centerCrop"/>  
  11. FrameLayout>  
点击某张图片进入的Activity:
[java] view plain copy
  1. public class ShowImageActivity extends Activity {  
  2.     private PhotoView mImageView;  
  3.     private ProgressBar mProgressBar;  
  4.   
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.photoview_layout);  
  8.         mImageView = (PhotoView) findViewById(R.id.iv_photo);  
  9.         mProgressBar = (ProgressBar) findViewById(R.id.photoview_progressbar);  
  10.         Intent intent = getIntent();  
  11.         if (intent != null) {  
  12.             String url = intent.getStringExtra("URL");  
  13.             Glide.with(this)  
  14.                     .load(url)  
  15.                     .listener(new RequestListener() {  
  16.                         @Override  
  17.                         public boolean onException(Exception e, String s, Target target, boolean b) {  
  18.   
  19.                             return false;  
  20.                         }  
  21.   
  22.                         @Override  
  23.                         public boolean onResourceReady(GlideDrawable glideDrawable, String s, Target target, boolean b, boolean b1) {  
  24.                             mProgressBar.setVisibility(View.GONE);  
  25.                             return false;  
  26.                         }  
  27.                     })  
  28.                     .diskCacheStrategy(DiskCacheStrategy.ALL)  
  29.                     .into(mImageView);  
  30.         }  
  31.         mImageView.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {  
  32.             @Override  
  33.             public void onPhotoTap(View view, float x, float y) {  
  34.                 finish();  
  35.             }  
  36.         });  
  37.     }  
  38. }  
[java] view plain copy
  1. photoview_layout:  
[java] view plain copy
  1. "code" class="html">"1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent">  
  5.   
  6.     
  7.         android:id="@+id/iv_photo"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="fill_parent"  
  10.         android:clickable="true" />  
  11.   
  12.     
  13.         android:id="@+id/photoview_progressbar"  
  14.         style="@android:style/Widget.ProgressBar.Large"  
  15.         android:layout_width="40dp"  
  16.         android:layout_height="40dp"  
  17.         android:layout_gravity="center"  
  18.         android:indeterminateDuration="3000"  
  19.         />  
  20.   
最后带上我的项目要添加的第三方包:


需要下载最新版的glide-3.6.1.jar
需要下载PhotoView第三方源码,然后导入它的library,如上图;

你可能感兴趣的:(RecyclerView+Glide+PhotoView)