Recyclerview takes too long to load when loading large number of images - android

I am trying to load images from a folder in my device to a recyclerview.
I am using Glide to load the images with a preloader for smoother scrolling.
The way which I set the adapter dataset is
I create a List<String> of the paths of images and then set it as the adapter's dataset.
My problem is that i takes a long time from the moment I assign the list as the dataset to the moment the recyclerview is shown on screen.
Any idea on how to reduce this delay?

Start loading the images via Glide on onBindViewHolder.

Related

Image loading is slow. Need to load only visible images

I am loading an image from memory into a RecyclerView. Not api call. From phone memory.
Each item in the RecyclerView has an image.
The images are loaded only when i scroll to them. Now the problem is, when i scroll fast to the 10th item, all 10 items are loading. When i view the 10th item, the 1-8 items are not visible in the device screen yet they are loading. How to prevent this. So when i see the 20th item, it is taking around 1 minute to load.
What I want is, load only visible images. When i scroll fast to the 20th item, load only the 20th item. 1-19 and 21-... should not load
Try not to load the image in original size in RecyclerView. This severely freezes the UI.
It is better to use thumbnail images to display in recycleview.
Consider the following example:
Glide
Glide.with(context).load(image_file).thumbnail().into(imageView)

android dynamically show list with text and images, improving performance

I need to display a list of items each with text and various number of images.
I'm currently using a ListView with custom adapter to show these items. And for each item, I used a HorizontalScrollView with a LinearLayout in it to display the images. In the getView method of the ListView, I read the image URIs of each item and dynamically create ImageViews, then load the images asynchronously. I used a ViewHolder to hold the LinearLayout which contains all the ImageViews of each item.
The problem is, if I scroll down the ListView and scroll back, I'll lost the content of the item, which means I have to load the images again. And most of the images are too large and loads very slow. Actually on my app the screen can show only about 2 or 3 items once, so the scroll happens very frequently.
I have some ideas to improve this, but I'm not sure whether one of them will results better.
Since I'm just showing a thumbnail of each image, maybe I can save the thumbnails into a temp dir and load them dynamically, loading small images will be much faster. And I might have to clear that temp dir when it gets large.
I have at most 9 images for each item, so it might still be slow even if I cache the thumbnails and scroll frequently. And maybe I have to show the list manually instead of using ListView, so each item will not be reused, and the load will happen only once. But, the list will grow large in the future, if I preserve like 100 items in the LinearLayout my app may still crash.
Other better options...
Any advice will be helpful! Thanks!
You can use LazyLoading to display your image. You can use Universal Image Loader for this purpose. What lazyloading does is download an image once, cache it and display the image from cache during subsequent requests.

GridView to load faster or synchronously

I have created a GridView to load like a gallery/ thumbnail list of Images
All though the overall result is good, the time it takes to load and call the repetitive getView can take a while on 100+ images.
Any thought on how do get the images to load faster
Of can you somehow cause an Adapter that extends BaseAdapter to load multiple getViews at once say 12 , as there are 12 images on the screen at any time.
Thanks in advance
the getView only gets called for the amount of images currently visable on the screen so it is not calling getView 100+ times, after the adapter loads the appropriate number of images to the adapter getView only gets called when you start scrolling. If you want faster loading create a smaller version of your image (thumbnail) so it does not load the full image every time
you should read this article about loading images
http://developer.android.com/training/displaying-bitmaps/index.html

How to load images one by one from database in GridView?

I have a custom GridView, in which images are loading from the database. If I load all the images before setting the adapter, then it takes too much time as there are more than 25 images (images are of size 30-35 kB each). If I load images one by one, then i need to set adapter after every image. And during loading of images one by one, when i scroll down, it moves to the top when new image is set...
I want my images to be load one by one, but if i scroll down then it should not move to the top when new image is loaded.
I sounds like you aren't using a background task to load the adapter. I would create an asynctask that is inside of an adapter and then call a new instance of the asynctask on every getView() call. It will then load each image one at a time, but also shouldn't move the view every time an image is updated. You can also use the same technique to add in a placement image while they are being loaded.

Lazy loading of images very slow in LIstView

I have implemented lazy loading of images(from remote server) in my application(twitter kind of app) and the fetching part and loading the image into the exact imageView works perfectly fine. But the "getView" part of the adapter gets called only after I scroll down the ListView and so images are fetched from remote server(I fetch images by executing an asyntask inside the adapter "getView" code) only after I scroll down and I can see a considerable amount of delay in the images being loaded. Once the images are loaded and stored in memory cache there is no problem while scrolling up or down. The only problem is images loading for the first time loading slow
So is there a way to rectify it in such a way that by the time I scroll down I should be able to get the image bitmap and the set the bitmap when I scroll down. I want it to be exactly like twitter app where I couldn't see lag in loading profile pictures.
TIA
Well your approach is incorrect you have to fetch all the images before showing them as get view called every time you scroll the list so every time your service get called and fetch the no. of images that a list can display on screen (say 4-5 at a time).
What you have to do is :-
1) Fetch all images.
2) As you fetch all the images set adapter to listview and you will have all images in your list without any delay as you already have downloaded the images,
But this is not lazy loading --
lazy loading means user got to see only some part of images at a time if he doest not scroll there is no point downloading images from service.
Hope that will be helpful
If you call your webservice in the getView() method, it will be called every time you scroll up and down. Since the getView method is called for the rows that are visible on screen.
What you could do, is load the images to a HashMap<int, Object>, where int == position in listview, and object is the image. In the getview you could then check if positions + (1 -> 10) have been loaded, and if not, retrieve them from the webservice in some kind of background task.
Load the images in the hashmap, and make the getView() method use those images. Not the images directly retrieved from the webservice. Otherwise, you indeed would have to wait for them to be retrieved. Also this way you cache the images in the hashmap instead of repeatedly retrieving the same ones when scrolling up and down.
Of course there are already people who have made such adapters, just by searching for it here I found this SO question, which has an answer that refers to the CommonsWare endless adapter.
There is a library called AALP that you can use to help you with Lazy loading of list views. https://bitbucket.org/zedvoid/aalp/src
This could save you some time and effort hopefully.

Categories

Resources