Skip to main content

Load images from external storage into GridView in Android using Picasso library

Activity:


public class Gallery extends ActionBarActivity {

public GridView imagegrid;
private ArrayList<String> imageUrls;
private ImagesAdapter imageAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gallery);
init();
}

private void init() {
final String[] columns= {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID};
final String orderBy= MediaStore.Images.Media.DATE_TAKEN;
Cursor imageCursor= this.getContentResolver().query(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));
}
 
imagegrid = (GridView) findViewById(R.id.GalleryViewLayout);

   DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width=metrics.widthPixels;
int height=metrics.heightPixels;
float scalefactor = getResources().getDisplayMetrics().density * 100;
int number=width;
int col = (int) ((float) number / (float) scalefactor);
imagegrid.setNumColumns(col);
imageAdapter=new ImagesAdapter(this,imageUrls,width,height);
imagegrid.setAdapter(imageAdapter);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.gallery, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
}

Xml:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.sachinsandbhor.gallerydemo.Gallery"
    tools:ignore="MergeRootFrame" >

    <GridView
        android:id="@+id/GalleryViewLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:numColumns="3" >
    </GridView>

</RelativeLayout>

Adapter:

public class ImagesAdapter extends BaseAdapter{

ArrayList<String> mList;
    LayoutInflater mInflater;
    Context mContext;
    SparseBooleanArray mSparseBooleanArray;
    int width,height;
    
    public ImagesAdapter(Context context, ArrayList<String> imageList, int Screenwidth, int Screenheight) {
        mContext = context;
        mInflater = LayoutInflater.from(mContext);
        mSparseBooleanArray = new SparseBooleanArray();
        mList = new ArrayList<String>();
        this.mList = imageList;
        this.width=Screenwidth;
        this.height=Screenheight;

    }
    

public void initialize() {
    mList.clear();
    final String[] columns= {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID};
final String orderBy= MediaStore.Images.Media.DATE_TAKEN;
Cursor imageCursor= mContext.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy +" DESC");
this.mList=new ArrayList<String>();
for(int i=0; i< imageCursor.getCount();i++){
imageCursor.moveToPosition(i);
int dataColumnIndex =imageCursor.getColumnIndex(MediaStore.Images.Media.DATA);
mList.add(imageCursor.getString(dataColumnIndex));
System.out.println("=====> Array path => "+mList.get(i));
}
imageCursor.close();
    }

    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 mList.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.galleryitem, null);
    }
    ImageView imageView = (ImageView) convertView.findViewById(R.id.thumbImage);
    float scalefactor = mContext.getResources().getDisplayMetrics().density * 100;
int number=width;
int columnsSize = (int) ((float) number / (float) scalefactor);
int newWidth=width/columnsSize;
int newHeight=height/4;
    Picasso.with(mContext).load("file://"+mList.get(position)).resize(newWidth,newHeight).centerCrop()
.placeholder(R.drawable.ic_launcher)
.into(imageView);
    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);
}
};
}

Custom xml :


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/FrameLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ImageView
        android:id="@+id/thumbImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:scaleType="fitXY" />
</FrameLayout>

Add below line to AndroidManifest.xml

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


Screenshot:




Here is the sample Code



Comments

Popular posts from this blog

How to check internet connectivity in Android app using BroadcastReceiver

So let's get started with How to check internet connectivity in Android using BroadcastReceiver. For this post I'm using Kotlin language. Well lots of people are using simple method to get network connectivity using ConnectivityManager. But using that approach we will get network state only when we are calling that method. So how would I know that network state changed. This will achieved using BroadcastReceiver.  What is BroadcastReceiver? BroadcastReceiver uses Publish-Subscribe pattern. Android app can send and receive messages from Android system and other apps.  Android system sends broadcast when various system events occurred like device charging, network state changes. Apps can register to receive specific broadcasts. When a broadcast is sent, the system automatically routes broadcasts to apps that have subscribed to receive that particular type of broadcast. So for this scenario we need to add some changes in AndroidManifest.xml file - ...

RxJava introduction for Android developer

RxJava is Java implementation of Reactive Extension. Basically it’s a library that composes asynchronous events by following Observer Pattern. You can create asynchronous data stream on any thread, transform the data and consumed it by an Observer on any thread. The library offers operators like map, combine, merge, filter and lot more that can be applied onto data stream.  Below are the list of schedulers available and their brief introduction. - Schedulers.io()  – This is used to perform non CPU-intensive operations like making network calls, reading disc / files, database operations etc., This maintains pool of threads. 

 - AndroidSchedulers.mainThread()  – This provides access to android Main Thread / UI Thread. Usually operations like updating UI, user interactions happens on this thread. We shouldn’t perform any intensive operations on this thread as it makes the app glitchy or ANR dialog can be thrown. 

 - Schedulers.newThre...

Get domain name from URL in android

Sample Code: String url="http://sports.in.msn.com/football-world-cup-2014/world-cup-animals-5"; String hostName=getDomainName(url); private CharSequence getDomainName(String shareURL) throws URISyntaxException {    URI uri = new URI(shareURL);    String domain = uri.getHost();     return domain; } above method return host name from given URL. You can get more from URL using below methods. uri.getProtocol(); uri.getAuthority(); uri.getHost(); uri.getPort(); uri.getPath(); uri.getQuery(); uri.getFile(); Output: protocol = http authority = sports.in.msn.com host = sports.in.msn.com port = -1 path = /football-world-cup-2014/world-cup-animals-5 query = null filename = /football-world-cup-2014/world-cup-animals-5