重新启动Activity时不保留网格视图状态

时间:2013-03-04 05:20:49

标签: android android-imageview android-gridview ondestroy universal-image-loader

我面临着在方向变化时保留网格视图状态的问题。最初,创建网格视图时,仅加载9个图像。当用户滚动网格视图时,更多图像被添加到网格视图中,这非常有效。单击网格视图上的图像时,会打开另一个活动,在图像视图上显示图像,现在,当我返回到网格活动时按下后退按钮,网格视图丢失了它的状态,这意味着,现在活动开始了从头开始,仅显示前9个图像。

使用Universal Image Down-loader库下载图像。

  1. 我在清单文件中指定了android:configChanges="keyboardHidden|orientation"

  2. 重写了onConfigurationChangedonRetainNonConfigurationInstance。 GridActivity:

  3. 调试后我发现onDestroy()方法是在退出活动而不是onPause()时调用的。我真的似乎无法找出这里似乎是什么问题。任何帮助将不胜感激。

    感谢。

    /** 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:

    / **为视图提供图像数据的类(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;
    }
    

    }

1 个答案:

答案 0 :(得分:0)

您应该在移动到网格视图时完成当前可见活动。这样网格视图始终会加载图像。