package com.wenhui.scrollableslidinguppanelayout; import android.annotation.SuppressLint; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewTreeObserver; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.ImageView; import com.wenhui.scrollableslidinguppanelayout.R; import com.squareup.picasso.Picasso; import com.wenhui.lib.scrollableslidinguppanelayout.ScrollableSlidingUpPaneLayout; public class ImageFragment extends Fragment implements LoaderCallbacks<Cursor>, OnItemClickListener, MainActivity.OnBackPressedListener { private ScrollableSlidingUpPaneLayout mLayout; private ImageAdapter mAdapter; private int mImageThumbnailSize; private int mImageThumbSpacing; private Uri mContentUri; private ImageView mFullSizeImage; private GridView mGridView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAdapter = new ImageAdapter(getActivity()); mImageThumbnailSize = getResources().getDimensionPixelSize(R.dimen.image_thumbnail_size); mImageThumbSpacing = getResources().getDimensionPixelSize( R.dimen.image_thumbnail_spacing); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mLayout = (ScrollableSlidingUpPaneLayout) inflater .inflate(R.layout.activity_main, container, false); mGridView = (GridView) mLayout.findViewById(R.id.gridView); mLayout.enableOverscroll(mGridView); // Don't show dim color mLayout.setCoveredFadeColor(0); mFullSizeImage = (ImageView) mLayout.findViewById(R.id.fullSizeImage); mGridView.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (mAdapter.getNumColumns() == 0) { final int numColumns = (int) Math.floor(mGridView .getWidth() / (mImageThumbnailSize + mImageThumbSpacing)); if (numColumns > 0) { final int columnWidth = (mGridView.getWidth() / numColumns) - mImageThumbSpacing; mAdapter.setNumColumns(numColumns); mAdapter.setItemHeight(columnWidth); } } } }); mGridView.setOnItemClickListener(this); mGridView.setAdapter(mAdapter); return mLayout; } @SuppressLint("NewApi") @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mContentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; getLoaderManager().initLoader(100, null, this); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onPause() { super.onPause(); } @Override public void onResume() { super.onResume(); } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { Cursor c = (Cursor)mAdapter.getItem(position); if( c != null ){ loadImage(c); mLayout.collapsePane(); } } @Override public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { String[] projection = { MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, }; String selection = ""; String[] selectionArgs = null; String order = MediaStore.Images.Media._ID + " DESC"; return new CursorLoader(getActivity(), // Parent activity context mContentUri, // Table to query projection, // Projection to return selection, selectionArgs, order); } @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor c) { c.moveToFirst(); loadImage(c); mAdapter.changeCursor(c); } @Override public void onLoaderReset(Loader<Cursor> arg0) { mAdapter.changeCursor(null); } private void loadImage(Cursor cursor) { int imageID = cursor.getInt(cursor .getColumnIndex(MediaStore.Images.Media._ID)); Uri uri = Uri.withAppendedPath(mContentUri, Integer.toString(imageID)); Picasso.with(getActivity()).load(uri).resize(400, 400).centerInside().into(mFullSizeImage); } private class ImageAdapter extends CursorAdapter { private final Context mContext; private int mItemHeight = 0; private int mNumColumns = 0; private GridView.LayoutParams mImageViewLayoutParams; public ImageAdapter(Context context) { super(context, null, 0); this.mContext = context; } @Override public void bindView(View view, Context arg1, Cursor cursor) { ImageView iv = (ImageView) view; // Check the height matches our calculated column width if (iv.getLayoutParams().height != mItemHeight) { iv.setLayoutParams(mImageViewLayoutParams); } int imageID = cursor.getInt(cursor .getColumnIndex(MediaStore.Images.Media._ID)); Uri uri = Uri.withAppendedPath(mContentUri, Integer.toString(imageID)); iv.setTag(R.id.position, cursor.getPosition()); // iv.setOnClickListener(mClickListener); Picasso.with(mContext).load(uri) .placeholder(R.drawable.empty_photo) .resize(mItemHeight, mItemHeight).centerCrop().into(iv); } @Override public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { ImageView imageView = new ImageView(mContext); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setLayoutParams(mImageViewLayoutParams); return imageView; } /** * Sets the item height. Useful for when we know the column width so the * height can be set to match. * * @param height */ public void setItemHeight(int height) { if (height == mItemHeight) { return; } mItemHeight = height; mImageViewLayoutParams = new GridView.LayoutParams( LayoutParams.MATCH_PARENT, mItemHeight); notifyDataSetChanged(); } public void setNumColumns(int numColumns) { mNumColumns = numColumns; } public int getNumColumns() { return mNumColumns; } } private OnClickListener mClickListener = new OnClickListener() { @Override public void onClick(View v) { int position = (Integer)v.getTag(R.id.position); Cursor c = (Cursor)mAdapter.getItem(position); if( c != null ){ loadImage(c); mGridView.smoothScrollToPosition(0); mLayout.collapsePane(); } } }; @Override public boolean onBackPressedCallback() { if( mLayout.isFullyExpanded() || mLayout.isExpandedHalfway() ){ mLayout.collapsePane(); return true; } else { return false; } } }