从睡眠模式恢复时保持GridView

时间:2012-11-26 17:38:55

标签: android gridview lifecycle android-gridview baseadapter

我遇到了一个非常大的GridView问题。(大约70个孩子)如果我在onCreate上启动它或者在按下主页按钮然后返回后恢复后,GridView工作正常。但是当我从睡眠模式恢复后恢复时,我的BaseAdapter再次启动并破坏了我在运行时对其所做的更改。如果我在重启后调用它,这也会使getChildAt()给出NullPointerException。

如何让它只是按常规onPause(主页按钮)对GridView执行操作,并避免每次从睡眠模式恢复时GridView都被清除?

编辑: 我试过为我的Activity类设置一个唤醒锁,它调用BaseAdpter而没有运气

2.编辑:自从我发布这个问题以来,我一直试图在onPause中使用此代码恢复GridView:

 SparseArray<Parcelable> array = new SparseArray<Parcelable>();
    gridView.saveHierarchyState(array);
    bundle = new Bundle();
    bundle.putSparseParcelableArray("state", array);

这是在onResume:

 try{
    gridView.restoreHierarchyState(bundle.getSparseParcelableArray("state"));
    }
    catch(Exception e){
        //Most likely first start
        Log.i("SomeTag", "No GridView state found");
    }

    }

奇怪的是我在屏幕上似乎从一个地方跳到另一个地方的一切,当我尝试getChildAt()时它仍然崩溃。在睡眠模式之后它也无法获得它。

  1. 编辑这是BaseAdapter getView的代码(注意!这些代码中的一部分是无关紧要的)
  2. public View getView(int position,View convertView,ViewGroup parent){

    mParentView = parent;
    
    
    DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;
    
        //sets the height for every individual box
    int box = width/7*6/10;
    
    ImageCell v = null;
    if (convertView == null) {
        // If it's not recycled, create a new ImageCell.
        v = new ImageCell (mContext);
        v.setLayoutParams(new GridView.LayoutParams(box, box));
        v.setScaleType(ImageView.ScaleType.CENTER_CROP);
        v.setPadding(0, 0, 0, 0);
    
    
    } else {
        v = (ImageCell) convertView;
    }
    
    v.mCellNumber = position;
    v.mGrid = (GridView) mParentView;
    v.mEmpty = true;
    int id = 200;
    v.setId(++id);
    
    String map = str[position];
    int pos = position;
    int up = pos-10;
    int down = pos+10;
    int left = pos-1;
    int right = pos+1;
    if(up>=0){
    above = str[up];
    }
    else{
        //Do nothing
    }
    if(down<70){
        under = str[down];
        }
    else{
        //Do nothing
    }
    if(left<=-1){
       //Do nothing
    }
    
    else{
        lefte=str[left];
    }
    if(right>=70){
        //Do nothing
     }     
     else{
        righte=str[right];
     }
    //if(left>-1|left!=9|left!=19|left!=29|left!=39|left!=49|left!=59){
       // lefte = str[left];
      //  }
     // else{
     //     Log.i("ImageCellAdapter", "Left is trying to break walls "+left);
        //Do nothing
      // }
    
    
    if (map.equals("mountain")) {
        //Checks surroundings to find out witch drawable to set  
        v.setBackgroundResource(R.color.cell_empty);
         v.mEmpty = false;
         //All
         if(above=="mountain"&&under=="mountain"&&lefte=="mountain"&&righte=="mountain"){
                v.setImageResource(R.drawable.mountain_full);
            }
         //Single
         else if(above=="mountain"&&under!="mountain"&&lefte!="mountain"&&righte!="mountain"){
                v.setImageResource(R.drawable.mountain_down);
            }
         else if(above!="mountain"&&under=="mountain"&&lefte!="mountain"&&righte!="mountain"){
                v.setImageResource(R.drawable.mountain_up);
            }
         else if(above!="mountain"&&under!="mountain"&&lefte!="mountain"&&righte=="mountain"){
                v.setImageResource(R.drawable.mountain_left);
            }
         else if(above!="mountain"&&under!="mountain"&&lefte=="mountain"&&righte!="mountain"){
                v.setImageResource(R.drawable.mountain_right);
            }
         //Double
         else if(above=="mountain"&&under!="mountain"&&lefte!="mountain"&&righte=="mountain"){
                v.setImageResource(R.drawable.mountain_left_down);
            }
         else if(above!="mountain"&&under=="mountain"&&lefte!="mountain"&&righte=="mountain"){
                v.setImageResource(R.drawable.mountain_left_up);
            }
         else if(above=="mountain"&&under!="mountain"&&lefte=="mountain"&&righte!="mountain"){
                v.setImageResource(R.drawable.mountain_right_down);
            }
         else if(above!="mountain"&&under=="mountain"&&lefte=="mountain"&&righte!="mountain"){
                v.setImageResource(R.drawable.mountain_up_right);
            }
         else if(above!="mountain"&&under!="mountain"&&lefte=="mountain"&&righte=="mountain"){
                v.setImageResource(R.drawable.mountain_up_down);
            }
         else if(above=="mountain"&&under=="mountain"&&lefte!="mountain"&&righte!="mountain"){
                v.setImageResource(R.drawable.mountain_up_down);
            }
         //Triple
         else if(above!="mountain"&&under=="mountain"&&lefte=="mountain"&&righte=="mountain"){
                v.setImageResource(R.drawable.mountain_left_right_down);
            }
         else if(above=="mountain"&&under=="mountain"&&lefte=="mountain"&&righte!="mountain"){
                v.setImageResource(R.drawable.mountain_left_up_down);
            }
         else if(above=="mountain"&&under!="mountain"&&lefte=="mountain"&&righte=="mountain"){
                v.setImageResource(R.drawable.mountain_left_up_right);
            }
         else if(above=="mountain"&&under=="mountain"&&lefte!="mountain"&&righte=="mountain"){
                v.setImageResource(R.drawable.mountain_up_right_down);
            }
         //None
            else{
        v.setImageResource(R.drawable.mountain);
            }
    
    }
    else if(map=="start"){
        List<String> posOf = Arrays.asList(str);
        startPos=posOf.indexOf("start");
        v.mEmpty=false;
        v.setBackgroundResource(R.color.cell_empty);
        getDur();
    
         BitmapDrawable first = (BitmapDrawable)mContext.getResources().getDrawable(R.drawable.gress);
         BitmapDrawable second =(BitmapDrawable)mContext.getResources().getDrawable(R.drawable.ic_launcher);
         BitmapDrawable third = (BitmapDrawable)mContext.getResources().getDrawable(R.drawable.gress);
         BitmapDrawable fourth = (BitmapDrawable)mContext.getResources().getDrawable(R.drawable.ic_launcher);
    
        final AnimationDrawable ani = new AnimationDrawable();       
           ani.addFrame(first, duration);
           ani.addFrame(second, duration);
           ani.addFrame(third, duration);
           ani.addFrame(fourth, duration);
           ani.setOneShot(true);
         v.setImageDrawable(ani);        
           checkIfAnimationDone(ani); 
        v.post(new Runnable() {   
            public void run() {
                   ani.start();
                    }
            });
    }
    else if(map=="stop"){
        v.mEmpty=false;
        v.setBackgroundResource(R.color.cell_empty);
        v.setImageResource(R.drawable.ic_launcher);
        v.setTag(1);
    }
    else if(map=="grass"){
        v.mEmpty=false;
        v.setBackgroundResource(R.drawable.gress);
    
    
    }
    else{
       //    v.setBackgroundResource (R.color.drop_target_enabled);
    v.setBackgroundResource (R.color.cell_empty);
    }
    //v.mGrid.requestDisallowInterceptTouchEvent (true);
    
    //v.setImageResource (R.drawable.hello);
    
    // Set up to relay events to the activity.
    // The activity decides which events trigger drag operations.
    // Activities like the Android Launcher require a long click to get a drag operation started.
    
    
    return v;
    

    }

    在onCreate中定义GridView:

    gridView= new BoxView(this);
    
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
    
                  w.getDefaultDisplay().getSize(size);
    
                  Measuredwidth = size.x;
                  Measuredheight = size.y; 
                }else{
                  Display d = w.getDefaultDisplay(); 
                  Measuredwidth = d.getWidth(); 
                  Measuredheight = d.getHeight(); 
                }
            int width = Measuredwidth/7*6;
    
        gridView.setLayoutParams(new GridView.LayoutParams(width,LayoutParams.FILL_PARENT, Gravity.CENTER_HORIZONTAL));
        gridView.setNumColumns(columns);
        gridView.setVerticalSpacing(0);
        gridView.setHorizontalSpacing(0);
        gridView.setPadding(0, 0, 0, 0);
        gridView.setId(101);
        gridView.setSelector(android.R.color.transparent);
        gridView.setAdapter (new ImageCellAdapter(this, MAP));
    

4 个答案:

答案 0 :(得分:4)

我注意到你的代码中有一件事:

gridView.setLayoutParams(new GridView.LayoutParams(width,LayoutParams.FILL_PARENT, Gravity.CENTER_HORIZONTAL));

即使GridViewViewGroup,您也无法访问LayoutParams。如果这可能意味着您可以将GridView置于另一个GridView内,请认为它已经过了。

在进一步说明之前解决这个问题,因为它正在弄乱你。

例如,如果您希望GridView位于LinearLayout内,请尝试:

gridView.setLayoutParams(new LinearLayout.LayoutParams(width,LayoutParams.FILL_PARENT, Gravity.CENTER_HORIZONTAL));

以下是this answer的正确实现:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /*You have to implement what things from the gridView sould be "saved"*/
        GridView gridView = new GridView(this) {

            @Override
            public Parcelable onSaveInstanceState() {
                // Create the Parceable object with the things you want to save
                                Parceable stateOfGrid = ....etc
                return stateOfGrid;
            }

                        @Override
            public void onRestoreInstanceState(Parcelable state) {
                // Restore your grid's parameters that you previously implemented in onSaveInstanceState
                super.onRestoreInstanceState(state);
                                ...
            }

        };

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onRestoreInstanceState(savedInstanceState);

                if (savedInstanceState != null) {
                    Parcelable state = savedInstanceState.getParcelable("state");
                    if (state != null) {
                        gridView.onRestoreInstanceState(state);
                        Log.d(this.getClass().getName(), "state restored!");                
                    }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // Put your grid's Parceable into the bundle
        super.onSaveInstanceState(outState);
                Parcelable state = gridView.onSaveInstanceState();
                outState.putParcelable("state", state);
    }


}

答案 1 :(得分:2)

尝试使用此标记:

android:configChanges="keyboard|keyboardHidden|orientation|screenSize"

答案 2 :(得分:1)

您可以使用onSaveInstanceState (Bundle outState) 保存gridview的状态

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Parcelable state = gridView.onSaveInstanceState();
    outState.putParcelable("state", state);
}

然后在onCreate中将适配器安装到grdiview后添加此代码

if (savedInstanceState != null) {
  Parcelable state = savedInstanceState.getParcelable("state");
  if (state != null) {
    gridView.onRestoreInstanceState(state);
    Log.d(this.getClass().getName(), "state restored!");                
  }
}

答案 3 :(得分:0)

您的应用程序是否在横向模式下运行?

如果是,那么您应该考虑添加标签

"android:configChanges="keyboard|keyboardHidden|orientation"用于您在Manifest.xml中的活动,这将阻止Android系统在您解锁屏幕时杀死您的活动并重新启动它。