-1

I am learning android and new to android. I want to pick multiple images from gallery and then want to show them in gridview and for that i am using UniversalImageLoader library 1.9.5

To Use UniversalImageLoader Library i added the following dependency in build.gradle app module

    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

and then i copied and pasted the solution from some tutorial

In This my mainactivity is like following in which i used universal image loader library

package tainning.infotech.lovely.selectmultipleimagesfromgallery;
    import java.util.ArrayList;
    import android.content.Context;    
    import android.database.Cursor;    
    import android.graphics.Bitmap;    
    import android.os.Bundle;    
    import android.provider.MediaStore;    
    import android.util.Log;    
    import android.util.SparseBooleanArray;    
    import android.view.LayoutInflater;    
    import android.view.View;    
    import android.view.ViewGroup;    
    import android.view.animation.Animation;    
    import android.view.animation.AnimationUtils;    
    import android.widget.BaseAdapter;    
    import android.widget.CheckBox;    
    import android.widget.CompoundButton;    
    import android.widget.Toast;    
    import android.widget.CompoundButton.OnCheckedChangeListener;    
    import android.widget.GridView;    
    import android.widget.ImageView;    
    import com.nostra13.universalimageloader.core.DisplayImageOptions;    
    import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;

    /**
     * @author Paresh Mayani (@pareshmayani)
     */
    public class MainActivity extends BaseActivity {

        private ArrayList<String> imageUrls;
        private DisplayImageOptions options;
        private ImageAdapter imageAdapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.content_main);

            final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
            final String orderBy = MediaStore.Images.Media.DATE_TAKEN;
            Cursor imagecursor = managedQuery(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
                    null, orderBy + " DESC");

            this.imageUrls = new ArrayList<String>();

            for (int i = 0; i < imagecursor.getCount(); i++) {
                imagecursor.moveToPosition(i);
                int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);
                imageUrls.add(imagecursor.getString(dataColumnIndex));

                System.out.println("=====> Array path => "+imageUrls.get(i));
            }

            options = new DisplayImageOptions.Builder()
                    .showStubImage(R.drawable.stub_image)
                    .showImageForEmptyUri(R.drawable.image_for_empty_url)
                    .cacheInMemory()
                    .cacheOnDisc()
                    .build();

            imageAdapter = new ImageAdapter(this, imageUrls);

            GridView gridView = (GridView) findViewById(R.id.gridview);
            gridView.setAdapter(imageAdapter);
            /*gridView.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    startImageGalleryActivity(position);
                }
            });*/
        }

        @Override
        protected void onStop() {
            imageLoader.stop();
            super.onStop();
        }

        public void btnChoosePhotosClick(View v){

            ArrayList<String> selectedItems = imageAdapter.getCheckedItems();
            Toast.makeText(MainActivity.this, "Total photos selected: "+selectedItems.size(), Toast.LENGTH_SHORT).show();
            Log.d(MainActivity.class.getSimpleName(), "Selected Items: " + selectedItems.toString());
        }

        /*private void startImageGalleryActivity(int position) {
            Intent intent = new Intent(this, ImagePagerActivity.class);
            intent.putExtra(Extra.IMAGES, imageUrls);
            intent.putExtra(Extra.IMAGE_POSITION, position);
            startActivity(intent);
        }*/

        public class ImageAdapter extends BaseAdapter {

            ArrayList<String> mList;
            LayoutInflater mInflater;
            Context mContext;
            SparseBooleanArray mSparseBooleanArray;

            public ImageAdapter(Context context, ArrayList<String> imageList) {
                // TODO Auto-generated constructor stub
                mContext = context;
                mInflater = LayoutInflater.from(mContext);
                mSparseBooleanArray = new SparseBooleanArray();
                mList = new ArrayList<String>();
                this.mList = imageList;

            }

            public ArrayList<String> getCheckedItems() {
                ArrayList<String> mTempArry = new ArrayList<String>();

                for(int i=0;i<mList.size();i++) {
                    if(mSparseBooleanArray.get(i)) {
                        mTempArry.add(mList.get(i));
                    }
                }

                return mTempArry;
            }

            @Override
            public int getCount() {
                return imageUrls.size();
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                if(convertView == null) {
                    convertView = mInflater.inflate(R.layout.row_multiphoto_item, null);
                }

                CheckBox mCheckBox = (CheckBox) convertView.findViewById(R.id.checkBox1);
                final ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView1);

                imageLoader.displayImage("file://"+imageUrls.get(position), imageView, options, new SimpleImageLoadingListener() {
                    @Override
                    public void onLoadingComplete(Bitmap loadedImage) {
                        Animation anim = AnimationUtils.loadAnimation(MainActivity.this,Animation.START_ON_FIRST_FRAME);
                        imageView.setAnimation(anim);
                        anim.start();
                    }
                });

                mCheckBox.setTag(position);
                mCheckBox.setChecked(mSparseBooleanArray.get(position));
                mCheckBox.setOnCheckedChangeListener(mCheckedChangeListener);

                return convertView;
            }

            OnCheckedChangeListener mCheckedChangeListener = new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    // TODO Auto-generated method stub
                    mSparseBooleanArray.put((Integer) buttonView.getTag(), isChecked);
                }
            };
        }

    } 




    but when i try to build the project it shows me the error following error

    Error:(26, 53) error: cannot find symbol class SimpleImageLoadingListener

    and also in following import statement

    import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;

    SimpleImageLoadingListener is underlined as red line.
    and it says cannot find symbol SimpleImageLoadingListener .

    The BaseActivity.java is following

    import android.app.Activity;

    import com.nostra13.universalimageloader.core.ImageLoader;

    /**
     * @author Paresh Mayani (@pareshmayani)
     */
    public abstract class BaseActivity extends Activity {

        protected ImageLoader imageLoader = ImageLoader.getInstance();

    }

    The UilApplication.java is like following 

    package tainning.infotech.lovely.selectmultipleimagesfromgallery;

    /**
     * Created by student on 4/5/2016.
     */

    import android.app.Application;
    import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
    import com.nostra13.universalimageloader.core.ImageLoader;
    import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

    /**
     * @author Paresh Mayani (@pareshmayani)
     */
    public class UILApplication extends Application {

        @Override
        public void onCreate() {
            super.onCreate();

            // This configuration tuning is custom. You can tune every option, you may tune some of them,
            // or you can create default configuration by
            //  ImageLoaderConfiguration.createDefault(this);
            // method.
            ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
                    .threadPoolSize(3)
                    .threadPriority(Thread.NORM_PRIORITY - 2)
                    .memoryCacheSize(1500000) // 1.5 Mb
                    .denyCacheImageMultipleSizesInMemory()
                    .discCacheFileNameGenerator(new Md5FileNameGenerator())
                    //.enableLogging() // Not necessary in common
                    .build();
            // Initialize ImageLoader with configuration.
            ImageLoader.getInstance().init(config);
        }
    }

    The manifest file is this

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="tainning.infotech.lovely.selectmultipleimagesfromgallery" >

        <!-- Include following permission if you load images from Internet -->
        <uses-permission android:name="android.permission.INTERNET" />
        <!-- Include following permission if you want to cache images on SD card -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name"
                android:theme="@style/AppTheme.NoActionBar" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>


    Build.gradle(Module:app) is like this

    apply plugin: 'com.android.application'

    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"

        defaultConfig {
            applicationId "tainning.infotech.lovely.selectmultipleimagesfromgallery"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.1.1'
        compile 'com.android.support:design:23.1.1'
        compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
    }



    Kindly help as soon as possible.

I searched for the solution of above problem but was not able to find any. I searched as much i can but didn't get the solution.

Thanks in advance
ArK
  • 20,698
  • 67
  • 109
  • 136
Ramandeep Mehmi
  • 81
  • 1
  • 13

2 Answers2

1

Try with:

import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;

instead:

import com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener;

As a tip to next time something like this happen in your code, write the name of the class only anywhere inside your class and then press alt and enter on the name of the class and you can see something like this to auto import the class:

enter image description here

Miguel Benitez
  • 2,322
  • 10
  • 22
  • But now it gives me out of memory error I did everything that is mentioned in docs like reducing thread size ,removing cacheInMemory() and used .bitmapConfig(Bitmap.Config.RGB_565) and .imageScaleType(ImageScaleType.EXACTLY) but it still gives me oom error – Ramandeep Mehmi Apr 06 '16 at 05:13
  • If you have a different question, open a new question with all the info that you can provide. Check this link: http://stackoverflow.com/help/how-to-ask , and don't forget to evaluate the answer given to you – Miguel Benitez Apr 06 '16 at 07:34
0

The error itself is self explanatory. Your import of build.gradle,

com.nostra13.universalimageloader:universal-image-loader:1.9.5

doesn't find required class file - com.nostra13.universalimageloader.core.assist.SimpleImageLoadingListener, it means either the package of the file is changed or the file itself is removed.

If you can manually search and download the universal-image-loader-1.9.3.jar, you can see there is no file with specified name in core folder but it is moved to core/listener folder.

So in your code you just need to update,

import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener
darshgohel
  • 382
  • 2
  • 13
  • But now it gives me out of memory error I did everything that is mentioned in docs like reducing thread size ,removing cacheInMemory() and used .bitmapConfig(Bitmap.Config.RGB_565) and .imageScaleType(ImageScaleType.EXACTLY) but it still gives me oom error – Ramandeep Mehmi Apr 06 '16 at 05:18