I'm facing an issue of retaining the grid view state on orientation change. Initially, when the grid view is created only 9 images are loaded. As and when the user scrolls the grid view more images are added to the grid view and this works perfectly. When the image on the grid view is clicked, another activity is opened which shows the image on a image view,now, on back button pressed when I return to the grid activity, the grid view loses it's state meaning that, now the activity starts from scratch again, which shows only the first 9 images loaded.
The images are downloaded using the Universal Image Down-loader library.
I have specified the
android:configChanges="keyboardHidden|orientation"
in the manifest file.Overridden the
onConfigurationChanged
andonRetainNonConfigurationInstance
. GridActivity:
After debugging I found out the the onDestroy() method is called on exit from the activity instead of just onPause(). I really can't seem to find out what seems to be the problem here. Any help would be appreciated.
Thanks.
/** The initial activity class which instantiates a gallery */
public class GalleryActivity extends Activity {
private GridView gridview;
private LinearLayout linlaProgressBar;
private int count = 9;
private GridImageAdapter gridImageAdapter;
private boolean loadMore = false;
private Vector<Image> imageDataList;
private Context context;
private int width = 0;
private int height = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("ACTIVITY ", "ON CREATE");
setContentView(R.layout.grid_layout);
linlaProgressBar = (LinearLayout) findViewById(R.id.linlaProgressBar);
gridview = (GridView) findViewById(R.id.gridview);
gridview.setPadding(10, 10, 10, 10);
imageDataList = new Vector<Image>(100);
setImageData();
context = this;
WindowManager winManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
int screenWidth = winManager.getDefaultDisplay().getWidth();
int screenHeight = winManager.getDefaultDisplay().getHeight();
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
width = (int) (screenWidth * 0.45);
height = (int) (screenHeight * 0.3);
} else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
width = (int) (screenWidth * 0.25);
height = (int) (screenHeight * 0.40);
}
// Check if old activity exist
GalleryActivity oldActivity = (GalleryActivity) getLastNonConfigurationInstance();
if (oldActivity == null) {
gridImageAdapter = new GridImageAdapter(this);
/* set the urls from which the image is to be loaded */
gridImageAdapter.addURL(imageDataList);
/* count is the initial number of images to be loaded */
gridImageAdapter.AddItems(count);
gridview.setColumnWidth(width);
gridImageAdapter.setDimensions(width, height);
/* set the adapter to the grid view */
gridview.setAdapter(gridImageAdapter);
} else {
gridImageAdapter = oldActivity.gridImageAdapter;
gridview.setColumnWidth(width);
gridImageAdapter.setDimensions(width, height);
gridview.setAdapter(gridImageAdapter);
}
linlaProgressBar.setVisibility(View.GONE);
gridview.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
loadMore = true;
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
linlaProgressBar.setVisibility(View.GONE);
}
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
GridImageAdapter gridAdaptr = (GridImageAdapter) gridview
.getAdapter();
int maxLimit = gridAdaptr.getCount();
if (maxLimit >= (imageDataList.size())) {
loadMore = false;
linlaProgressBar.setVisibility(View.GONE);
} else if (lastInScreen == totalItemCount && (loadMore)) {
linlaProgressBar.setVisibility(View.VISIBLE);
/*
* To check that the number of items added never exceeds the
* total images count
*/
int threshHold = maxLimit + visibleItemCount;
if ((threshHold) > imageDataList.size()) {
int newVisibleItemCount = visibleItemCount
- (threshHold - imageDataList.size());
gridAdaptr.AddItems(newVisibleItemCount);
} else {
gridAdaptr.AddItems(visibleItemCount);
}
gridAdaptr.notifyDataSetChanged();
loadMore = false;
}
}
});
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View view,
int position, long id) {
Log.i("ITEM", "CLICKED");
Intent intent = new Intent(GalleryActivity.this,
HSMainActivity.class)
.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
| Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("itemPosition", position);
intent.putExtra("imageurl", imageDataList.get(position)
.getUrl());
context.startActivity(intent);
}
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
public Object onRetainNonConfigurationInstance() {
Log.i("ACTIVITY", "ON RETAIN CONFIGURATION");
return this;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_gallery, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
switch (item.getItemId()) {
case R.id.menu_settings:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("ACTIVITY", "ONDESTROY");
int count = gridview.getCount();
for (int i = 0; i < count; i++) {
final ViewGroup v = (ViewGroup) gridview.getChildAt(i);
if (v != null) {
v.removeAllViews();
}
}
}
@Override
protected void onPause() {
Log.i("ACTIVITY", "on PAUSE");
super.onPause();
}
@Override
protected void onResume() {
Log.i("ACTIVITY", "ON RESUME");
super.onResume();
}
/* get the image data */
public void setImageData() {
ImageData imageData = new ImageData();
imageDataList.clear();
imageDataList = imageData.getImageData();
}
}
GridAdapter:
/** Adapter for the GridView class which extends the BaseAdapter */
public class GridImageAdapter extends BaseAdapter {
private Context context;
private LayoutInflater layoutInflater;
private int width = 0;
private int height = 0;
private int textFactor = 35;
private int mCount = 0;
private DisplayImageOptions options;
private Vector<Image> images;
public GridImageAdapter(Context mContext) {
context = mContext;
layoutInflater = LayoutInflater.from(context);
images = new Vector<Image>(100);
/* options for the image loader */
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.loading)
.showImageForEmptyUri(R.drawable.loading)
.showImageOnFail(R.drawable.not_found).cacheInMemory()
.cacheOnDisc().resetViewBeforeLoading()
.bitmapConfig(Bitmap.Config.RGB_565).build();
}
public int getCount() {
return getTotalCount();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = null;
TextView textView = null;
int imagePadding = 10;
if (convertView == null) {
convertView = new View(context);
convertView = layoutInflater.inflate(R.layout.grid_cell_layout,
null);
convertView.setPadding(3, 0, imagePadding - 1, imagePadding);
convertView.setBackgroundResource(R.drawable.background_shadow);
convertView
.setLayoutParams(new GridView.LayoutParams(width, height));
} else {
convertView = (View) convertView;
}
imageView = (ImageView) convertView.findViewById(R.id.image);
// Toast.makeText(context, "Width:" + width + "Height:" + height,
// Toast.LENGTH_SHORT).show();
/** height has to be reduced to display the text */
imageView.setLayoutParams(new LinearLayout.LayoutParams(width, height
- textFactor));
imageView.setAdjustViewBounds(true);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
/** Universal Image Loader is used to load the images */
textView = (TextView) convertView.findViewById(R.id.title);
textView.setText(images.get(position).getName());
/** Check if the file exists in the disc cache */
if (ImageLoader.getInstance().getDiscCache()
.get(images.get(position).getUrl()).exists()) {
String imageUri = "file://"
+ ImageLoader.getInstance().getDiscCache()
.get(images.get(position).getUrl())
.getAbsolutePath(); // from SD
// card
// Log.i("file path", imageUri);
ImageLoader.getInstance()
.displayImage(imageUri, imageView, options);
// Log.i("Image exists in cache", "!!!");
} else {
ImageLoader.getInstance().displayImage(
images.get(position).getUrl(), imageView, options);
}
textView.setTextColor(Color.BLACK);
return convertView;
}
public int AddItems(int count) {
mCount = mCount + count;
return mCount;
}
public int getTotalCount() {
return mCount;
}
public void addURL(Vector<Image> imageDataList) {
images.clear();
images = imageDataList;
}
public void setDimensions(int screenWidth, int screenHeight) {
width = screenWidth;
height = screenHeight;
}
}
ImageData:
/** Class which provides image data to the views (GridView..) */
public class ImageData {
public Vector<Image> getImageData() {
Vector<Image> imageData = new Vector<Image>(100);
Image imageData0 = new Image();
imageData0.setName("image 0");
imageData0.setUrl("https://lh6.googleusercontent.com/-jZgveEqb6pg/T3R4kXScycI/AAAAAAAAAE0/xQ7CvpfXDzc/s1024/sample_image_01.jpg");
imageData.add(imageData0);
Image imageData1 = new Image();
imageData1.setName("image 1");
imageData1.setUrl("https://lh4.googleusercontent.com/-K2FMuOozxU0/T3R4lRAiBTI/AAAAAAAAAE8/a3Eh9JvnnzI/s1024/sample_image_02.jpg");
imageData.add(imageData1);
Image imageData2 = new Image();
imageData2.setName("image 2");
imageData2.setUrl("https://lh5.googleusercontent.com/-SCS5C646rxM/T3R4l7QB6xI/AAAAAAAAAFE/xLcuVv3CUyA/s1024/sample_image_03.jpg");
imageData.add(imageData2);
Image imageData3 = new Image();
imageData3.setName("image 3");
imageData3.setUrl("https://lh6.googleusercontent.com/-f0NJR6-_Thg/T3R4mNex2wI/AAAAAAAAAFI/45oug4VE8MI/s1024/sample_image_03.jpg");
imageData.add(imageData3);
Image imageData4 = new Image();
imageData4.setName("image 4");
imageData4.setUrl("https://lh3.googleusercontent.com/-n-xcJmiI0pg/T3R4mkSchHI/AAAAAAAAAFU/EoiNNb7kk3A/s1024/sample_image_04.jpg");
imageData.add(imageData4);
Image imageData5 = new Image();
imageData5.setName("image 5");
imageData5.setUrl("https://lh3.googleusercontent.com/-n-xcJmiI0pg/T3R4mkSchHI/AAAAAAAAAFU/EoiNNb7kk3A/s1024/sample_image_05.jpg");
imageData.add(imageData5);
Image imageData6 = new Image();
imageData6.setName("image 6");
imageData6.setUrl("https://lh3.googleusercontent.com/-X43vAudm7f4/T3R4nGSChJI/AAAAAAAAAFk/3bna6D-2EE8/s1024/sample_image_06.jpg");
imageData.add(imageData6);
Image imageData7 = new Image();
imageData7.setName("image 7");
imageData7.setUrl("https://lh5.googleusercontent.com/-MpZneqIyjXU/T3R4nuGO1aI/AAAAAAAAAFg/r09OPjLx1ZY/s1024/sample_image_07.jpg");
imageData.add(imageData7);
Image imageData8 = new Image();
imageData8.setName("image 8");
imageData8.setUrl("https://lh6.googleusercontent.com/-ql3YNfdClJo/T3XvW9apmFI/AAAAAAAAAL4/_6HFDzbahc4/s1024/sample_image_08.jpg");
imageData.add(imageData8);
Image imageData9 = new Image();
imageData9.setName("image 9");
imageData9.setUrl("https://lh5.googleusercontent.com/-Pxa7eqF4cyc/T3R4oasvPEI/AAAAAAAAAF0/-uYDH92h8LA/s1024/sample_image_09.jpg");
imageData.add(imageData9);
Image imageData10 = new Image();
imageData10.setName("image 10");
imageData10.setUrl("https://lh4.googleusercontent.com/-Li-rjhFEuaI/T3R4o-VUl4I/AAAAAAAAAF8/5E5XdMnP1oE/s1024/sample_image_10.jpg");
imageData.add(imageData10);
Image imageData11 = new Image();
imageData11.setName("image 11");
imageData11.setUrl("https://lh5.googleusercontent.com/-_HU4fImgFhA/T3R4pPVIwWI/AAAAAAAAAGA/0RfK_Vkgth4/s1024/sample_image_11.jpg");
imageData.add(imageData11);
Image imageData12 = new Image();
imageData12.setName("image 12");
imageData12.setUrl("https://lh6.googleusercontent.com/-0gnNrVjwa0Y/T3R4peGYJwI/AAAAAAAAAGU/uX_9wvRPM9I/s1024/sample_image_12.jpg");
imageData.add(imageData12);
Image imageData13 = new Image();
imageData13.setName("image 13");
imageData13.setUrl("https://lh3.googleusercontent.com/-HBxuzALS_Zs/T3R4qERykaI/AAAAAAAAAGQ/_qQ16FaZ1q0/s1024/sample_image_13.jpg");
imageData.add(imageData13);
Image imageData14 = new Image();
imageData14.setName("image 14");
imageData14.setUrl("https://lh4.googleusercontent.com/-cKojDrARNjQ/T3R4qfWSGPI/AAAAAAAAAGY/MR5dnbNaPyY/s1024/sample_image_14.jpg");
imageData.add(imageData14);
Image imageData15 = new Image();
imageData15.setName("image 15");
imageData15.setUrl("https://lh3.googleusercontent.com/-WujkdYfcyZ8/T3R4qrIMGUI/AAAAAAAAAGk/277LIdgvnjg/s1024/sample_image_15.jpg");
imageData.add(imageData15);
Image imageData16 = new Image();
imageData16.setName("image 16");
imageData16.setUrl("https://lh6.googleusercontent.com/-FMHR7Vy3PgI/T3R4rOXlEKI/AAAAAAAAAGs/VeXrDNDBkaw/s1024/sample_image_16.jpg");
imageData.add(imageData16);
Image imageData17 = new Image();
imageData17.setName("image 17");
imageData17.setUrl("https://lh4.googleusercontent.com/-mrR0AJyNTH0/T3R4rZs6CuI/AAAAAAAAAG0/UE1wQqCOqLA/s1024/sample_image_17.jpg");
imageData.add(imageData17);
Image imageData18 = new Image();
imageData18.setName("image 18");
imageData18.setUrl("https://lh6.googleusercontent.com/-z77w0eh3cow/T3R4rnLn05I/AAAAAAAAAG4/BaerfWoNucU/s1024/sample_image_18.jpg");
imageData.add(imageData18);
Image imageData19 = new Image();
imageData19.setName("image 19");
imageData19.setUrl("https://lh5.googleusercontent.com/-aWVwh1OU5Bk/T3R4sAWw0yI/AAAAAAAAAHE/4_KAvJttFwA/s1024/sample_image_19.jpg");
imageData.add(imageData19);
Image imageData20 = new Image();
imageData20.setName("image 20");
imageData20.setUrl("https://lh6.googleusercontent.com/-q-js52DMnWQ/T3R4tZhY2sI/AAAAAAAAAHM/A8kjp2Ivdqg/s1024/sample_image_20.jpg");
imageData.add(imageData20);
return imageData;
}
}