Created
December 6, 2014 22:08
-
-
Save sr105/5786504f8e119b745399 to your computer and use it in GitHub Desktop.
gridview with square cells, look at setupAdapter()
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="utf-8"?> | |
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" | |
android:id="@+id/gallery_item_imageView" | |
android:layout_width="match_parent" | |
android:layout_height="120dp" | |
android:layout_gravity="center" | |
android:contentDescription="@string/grid_image_description" | |
android:scaleType="centerCrop" /> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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