Skip to content

Instantly share code, notes, and snippets.

@sr105
Created December 6, 2014 22:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sr105/5786504f8e119b745399 to your computer and use it in GitHub Desktop.
Save sr105/5786504f8e119b745399 to your computer and use it in GitHub Desktop.
gridview with square cells, look at setupAdapter()
package com.rdm.photogallery;
import java.util.ArrayList;
import android.app.Activity;
import android.app.Fragment;
import android.app.SearchManager;
import android.app.SearchableInfo;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SearchView;
import com.rdm.photogallery.ThumbnailDownloader.Listener;
public class PhotoGalleryFragment extends Fragment {
private static final String TAG = "PhotoGalleryFragment";
private GridView mGridView;
private ArrayList<GalleryItem> mItems;
private int mCurrentPage = 0;
private int mFetchedPage = 0;
private ThumbnailDownloader<ImageView> mThumbnailThread;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
setHasOptionsMenu(true);
updateItems();
mThumbnailThread = new ThumbnailDownloader<ImageView>(new Handler());
mThumbnailThread.setListener(new Listener<ImageView>() {
@Override
public void onThumbnailDownloaded(ImageView imageView, Bitmap thumbnail) {
if (isVisible()) {
imageView.setImageBitmap(thumbnail);
}
}
});
mThumbnailThread.start();
mThumbnailThread.getLooper();
Log.i(TAG, "Background thread started");
}
public void reset() {
mCurrentPage = 0;
mFetchedPage = 0;
mItems.clear();
}
public void updateItems() {
new FetchItemsTask().execute(++mCurrentPage);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_photo_gallery, container, false);
mItems = new ArrayList<GalleryItem>();
mGridView = (GridView)v.findViewById(R.id.gridView);
mGridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> gridView, View view,
int pos, long id) {
GalleryItem item = mItems.get(pos);
Uri photoPageUri = Uri.parse(item.getPhotoUrl());
Intent i = new Intent(getActivity(), PhotoPageActivity.class);
i.setData(photoPageUri);
startActivity(i);
}
});
mGridView.setOnScrollListener(new OnScrollListener() {
int lastFirstVisibleItem = -1;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (visibleItemCount > 0 &&
firstVisibleItem + visibleItemCount == totalItemCount &&
mCurrentPage == mFetchedPage) {
updateItems();
Log.i(TAG, "Scrolled to end of " + totalItemCount +", fetching next page, #" + mCurrentPage);
}
// The adapter or view code is calling this routine after each image in the
// grid is filled. Let's just call it once per scrolled position.
if (firstVisibleItem == lastFirstVisibleItem || totalItemCount == 0)
return;
lastFirstVisibleItem = firstVisibleItem;
int start = firstVisibleItem + visibleItemCount;
int end = start + 30 > mItems.size() ? mItems.size() : start + 30;
// int start2 = firstVisibleItem - 1;
// int end2 = start2 - 30 < 1 ? 1 : start2 - 30;
//
// Log.i(TAG, "Prefetch: (" + start + ", " + end + ") + (" + start2 + ", " + end2 + ")");
for (int i = start; i < end; i++) {
mThumbnailThread.queueThumbnail(null, mItems.get(i).getUrl());
}
start = firstVisibleItem - 1;
end = start - 30 < 1 ? 1 : start - 30;
for (int i = start; i > end; i--) {
mThumbnailThread.queueThumbnail(null, mItems.get(i).getUrl());
}
}
});
setupAdapter();
return v;
}
@Override
public void onDestroy() {
super.onDestroy();
mThumbnailThread.quit();
Log.i(TAG, "Background thread destroyed");
}
@Override
public void onDestroyView() {
super.onDestroyView();
mThumbnailThread.clearQueue();
}
private void setupSearchView(Menu menu) {
// Pull out the SearchView
MenuItem searchItem = menu.findItem(R.id.menu_item_search);
SearchView searchView = (SearchView)searchItem.getActionView();
// Get the data from our searchable.xml as a SearchableInfo
SearchManager searchManager = (SearchManager)getActivity()
.getSystemService(Context.SEARCH_SERVICE);
ComponentName name = getActivity().getComponentName();
SearchableInfo searchInfo = searchManager.getSearchableInfo(name);
searchView.setSearchableInfo(searchInfo);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_photo_gallery, menu);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
setupSearchView(menu);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_search:
getActivity().onSearchRequested();
return true;
case R.id.menu_item_clear:
PreferenceManager.getDefaultSharedPreferences(getActivity())
.edit()
.putString(FlickrFetchr.PREF_SEARCH_QUERY, null)
.commit();
reset();
updateItems();
return true;
case R.id.menu_item_toggle_polling:
boolean shouldStartAlarm = !PollService.isServiceAlarmOn(getActivity());
PollService.setServiceAlarm(getActivity(), shouldStartAlarm);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
getActivity().invalidateOptionsMenu();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem toggleItem = menu.findItem(R.id.menu_item_toggle_polling);
if (PollService.isServiceAlarmOn(getActivity())) {
toggleItem.setTitle(R.string.stop_polling);
} else {
toggleItem.setTitle(R.string.start_polling);
}
}
void setupAdapter() {
if (getActivity() == null || mGridView == null) return;
if (mGridView.getAdapter() == null) {
mGridView.setAdapter(new GalleryItemAdapter(mItems));
} else {
GalleryItemAdapter adapter = (GalleryItemAdapter)mGridView.getAdapter();
adapter.notifyDataSetChanged();
}
}
private class FetchItemsTask extends AsyncTask<Integer,Void,ArrayList<GalleryItem>> {
@Override
protected ArrayList<GalleryItem> doInBackground(Integer... params) {
Activity activity = getActivity();
if (activity == null)
return new ArrayList<GalleryItem>();
String query = PreferenceManager.getDefaultSharedPreferences(activity)
.getString(FlickrFetchr.PREF_SEARCH_QUERY, null);
if (query != null)
return new FlickrFetchr().search(query, params[0]);
return new FlickrFetchr().fetchItems(params[0]);
}
@Override
protected void onPostExecute(ArrayList<GalleryItem> items) {
Log.i(TAG, "Items returned = " + items.size());
mItems.addAll(items);
mFetchedPage++;
setupAdapter();
}
}
private class GalleryItemAdapter extends ArrayAdapter<GalleryItem> {
public GalleryItemAdapter(ArrayList<GalleryItem> items) {
super(getActivity(), 0, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getActivity().getLayoutInflater()
.inflate(R.layout.gallery_item, parent, false);
}
ImageView imageView = (ImageView)convertView.findViewById(R.id.gallery_item_imageView);
imageView.setImageDrawable(null);
//imageView.setImageResource(R.drawable.brian_up_close);
GalleryItem item = getItem(position);
mThumbnailThread.queueThumbnail(imageView, item.getUrl());
return convertView;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment