Using RecyclerView Instead of ViewPager For Gallery
Phimpme is an Image app that provide camera, editing ,sharing options and a gallery section. The Gallery section allows us to view large number of images that are locally available in the users device. Generally developers used viewpager to swipe the horizontal images although we are also using viewPager but the problem is it is taking more time to load large size images and that disturb the user smooth experience. After so much research I came to new solution. So in this post, I will be explaining how to use recyclerview to view gallery images instead of viewPager.
Let’s get started
Make sure you have Recyclerview support in your dependencies in build.gradle. As recyclerView required an adapter and viewHolder to set data in recyclerView. So I will be explaining about adapter.
ViewHolder for RecyclerView
public static class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
LinearLayout linearLayout;
public ViewHolder(View itemView) {
super(itemView);
imageView = new ImageView(context);
linearLayout = (LinearLayout) itemView.findViewById(R.id.layout);
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
width, height);
imageView.setLayoutParams(params);
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
linearLayout.addView(imageView);
}
}
Right now the imageView is adjusting according to device screen size so that it will be compatible with all devices.
I am passing the width and height in LayoutParams to parent of imageview i.e in our case linearlayout is parentView.
Adapter for RecyclerView
public ImageAdapter(ArrayList<Media> media) {
this.media = media;
}
@Override
public ImageAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.unit_image_pager, null, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Glide.with(getContext())
.load(media.get(position).getUri())
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.thumbnail(0.5f)
.into(holder.imageView);
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
basicCallBack.callBack(0,null);
}
});
}
MediaList is an arrray of media that contains the list of images with URI that will help to load images. I am using Glide to load images you can use any library to load images. Adapter helps to load data in recyclerView.
Now set viewPager where you require to scroll images horizontally
@BindView(R.id.photos_pager)
RecyclerView mRecylerPager;
mRecylerPager.setLayoutManager(linearLayoutManager);
mRecylerPager.setHasFixedSize(true);
mRecylerPager.setLongClickable(true);
Our recycler view is ready now the most important part is to set things onPageChangeListner. For example : In Phimpme we are getting path of current position image to show in image description so to update the value we are writing that codde in onPageChangeListner and to update the toolbar.
mViewPager.setOnPageChangeListener(new PagerRecyclerView.OnPageChangeListener() {
@Override
public void onPageChanged(int oldPosition, int position) {
getAlbum().setCurrentPhotoIndex(position);
toolbar.setTitle((position + 1) + " " + getString(R.string.of) + " " + size_all);
invalidateOptionsMenu();
pathForDescription = getAlbum().getMedia().get(position).getPath();
}
});
To scroll to the given position we require to set the position to recyclerView and it can be done by the following code
mViewPager.scrollToPosition(getCurrentPsotion());
This is how I implemented the recyclerView instead of ViewPager to load gallery images faster as compare to ViewPager.
RecyclerView in Phimpme to load gallery Images