I am using the universal image loader to display the images as thumbnail in ListView however i am getting the out of memory error and when i scroll the list than the new view is having the images of first view when the list was not on scroll stage but than the images gets set to proper image which it should be.
public class NewAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<String> movieThumbnail;
private ArrayList<String> movieText;
private static LayoutInflater inflater=null;
static File cacheDir;
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(activity)
.memoryCache(new WeakMemoryCache())
.denyCacheImageMultipleSizesInMemory()
.discCache(new UnlimitedDiscCache(cacheDir))
.threadPoolSize(5)
.imageDownloader(new URLConnectionImageDownloader(120 * 1000, 120 * 1000))
.enableLogging()
.build();
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheOnDisc()
.cacheInMemory()
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.build();
private ImageLoader imageLoader= ImageLoader.getInstance();
public NewAdapter(Activity a, ArrayList<String> movieThumbnail, ArrayList<String> movieText) {
activity = a;
/*data=d;*/
this.movieThumbnail = movieThumbnail;
this.movieText = movieText;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"JunkFolder");
else
cacheDir=activity.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
imageLoader.init(config);
}
public int getCount() {
return movieText.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.listrow, null);
TextView text=(TextView)vi.findViewById(R.id.rowListTextView);
ImageView image=(ImageView)vi.findViewById(R.id.movieImage);
text.setText(movieText.get(position));
imageLoader.displayImage(movieThumbnail.get(position), image, options);
return vi;
}
}
and here is Xml Layout for ImageView and TextView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text_relativelayout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/latest_list_toggle" />
<ImageView
android:id="@+id/movieImage"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="12dp"
android:layout_marginTop="14dp" />
<TextView
android:id="@+id/rowListTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/movieImage"
android:paddingBottom="10dp"
android:paddingLeft="10dp"
android:paddingRight="21dp"
android:paddingTop="20dp"
android:text="@string/app_name"
android:textColor="@android:color/black"
android:textSize="17sp"
android:textStyle="bold" />
</RelativeLayout>
Set .resetViewBeforeLoading()
in DisplayImageOptions.
try next (all of them or several):
Reduce thread pool size in configuration (.threadPoolSize(...)). 1 - 5 is recommended. Use
.bitmapConfig(Bitmap.Config.RGB_565)
in display options. Bitmaps in RGB_565 consume 2 times less memory than in ARGB_8888. Use
.memoryCache(new WeakMemoryCache())
in configuration or disable caching in memory at all in display options (don't call .cacheInMemory()). Use
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
in display options. Or try
.imageScaleType(ImageScaleType.EXACTLY).
Avoid using RoundedBitmapDisplayer. It creates new Bitmap object with ARGB_8888 config for displaying during work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With