ListView中的CheckBoxes在屏幕旋转时消失

时间:2012-04-26 16:14:30

标签: android android-listview rotation checkbox

我的应用第一个所做的是通过设置其可见性ListView 来加载其项目隐身CheckBoxes的{​​{1}}。当用户选中菜单按钮时,它将打开和关闭View.Gone可见性和其他一些布局。下面是代码,我删除了一些不必要的部分:

CheckBox

它工作正常,但问题是当屏幕旋转时应用程序不起作用(更改屏幕方向)。一切都很好,因为它显示了一些布局,但只有private void editmodeSwitch(boolean flag){ // get topbar, bottombar, and bottombar2 LinearLayout topbar = (LinearLayout) findViewById(R.id.task_topbar_linearLayout); LinearLayout bottombar = (LinearLayout) findViewById(R.id.task_bottombar1_linearlayout); LinearLayout bottombar2 = (LinearLayout) findViewById(R.id.task_bottombar2_linearlayout); if(flag){ isEditmodeOn = true; // make topbar and bottombar2 visilble, but bottombar gone topbar.setVisibility(View.VISIBLE); bottombar.setVisibility(View.GONE); bottombar2.setVisibility(View.VISIBLE); // make checkboxes visible in listview visible as well for(int i=0; i<listView.getChildCount(); i++){ LinearLayout ll = (LinearLayout) listView.getChildAt(i); CheckBox cb = (CheckBox) ll.findViewById(R.id.task_row_checkBox1); cb.setVisibility(View.VISIBLE); } } else{ isEditmodeOn = false; topbar.setVisibility(View.GONE); bottombar.setVisibility(View.VISIBLE); bottombar2.setVisibility(View.GONE); // set each checkbox false and its visibility gone for(int i=0; i<listView.getChildCount(); i++){ LinearLayout ll = (LinearLayout) listView.getChildAt(i); CheckBox cb = (CheckBox) ll.findViewById(R.id.task_row_checkBox1); cb.setVisibility(View.GONE); cb.setChecked(false); } } } onCreate()`:

CheckBoxes in list items. Below is the code in

我猜测最后加载了@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.task_layout); initialize(); loadDB(); updateListAdapter(list_title, list_date); // in case of screen rotation if(savedInstanceState != null){ isEditmodeOn = savedInstanceState.getBoolean(EDITMODE_CHECK); isItemChecked = savedInstanceState.getBoolean(ITEM_CHECK); if(isEditmodeOn){ if(!isItemChecked){ Log.i(tag, "item NOT checked"); editmodeSwitch(true); } else{ //this is something different so please don't mind deditmodeSwitch(savedInstanceState.getBooleanArray(LIST_CB_CHECK)); } } } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // save values for rotation outState.putBoolean(EDITMODE_CHECK, isEditmodeOn); outState.putBoolean(ITEM_CHECK, isItemChecked); outState.putBooleanArray(LIST_CB_CHECK, list_cb_check); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.i(tag, "you're in onRestoreInstanceState()"); // in case of screen rotation if(savedInstanceState != null){ isEditmodeOn = savedInstanceState.getBoolean(EDITMODE_CHECK); isItemChecked = savedInstanceState.getBoolean(ITEM_CHECK); if(isEditmodeOn){ if(!isItemChecked){ Log.i(tag, "item NOT checked"); editmodeSwitch(true); } else{ // this is for something else so please ignore this part editmodeSwitch(savedInstanceState.getBooleanArray(LIST_CB_CHECK)); } } } 。因此,即使ListView中的代码使onCreate()可见,CheckBoxes也会再次变为不可见,因为它在xml中的初始化将会这样做。但是,我被困在这里,需要你的建议来解决这个问题。任何人都可以帮助我吗?

以下是getview的布局xml文件的复选框代码。

CheckBoxes

3 个答案:

答案 0 :(得分:1)

覆盖onSaveInstanceState以节省屏幕轮值,onRestoreInstanceState为:

protected void onCreate(Bundle savedInstanceState) {

    if(null != savedInstanceState)
            {
                Boolean IntTest = savedInstanceState.getBoolean("ITEM_CHECK");
                Boolean StrTest = savedInstanceState.getBoolean("ITEM_CHECK");
                Log.e(TAG, "onCreate get the   savedInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);        
            }
}
        @Override
        public void onSaveInstanceState(Bundle savedInstanceState) {
            // Save away the CheckBoxes states, so we still have it if the activity
            // needs to be killed while paused.

          savedInstanceState.putBoolean(EDITMODE_CHECK, 0);
          savedInstanceState.putBoolean(ITEM_CHECK, 0);
          super.onSaveInstanceState(savedInstanceState);
          Log.e(TAG, "onSaveInstanceState");
        } 
        @Override
        public void onRestoreInstanceState(Bundle savedInstanceState) {
          super.onRestoreInstanceState(savedInstanceState);
          Boolean IntTest = savedInstanceState.getBoolean(EDITMODE_CHECK);
          Boolean StrTest = savedInstanceState.getBoolean(ITEM_CHECK);
          Log.e(TAG, "onRestoreInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);
        }

答案 1 :(得分:0)

与覆盖onCreate的方式类似,您可以覆盖onConfigurationChanged(...),您可以设置在屏幕更改方向时运行。

为了在屏幕旋转时触发OnConfigurationChanged(...),您需要编辑清单并将该关系/规则放入。

这很容易做,但需要一些解释,之前在这个问题中得到了解答: Activity restart on rotation Android

编辑:这是关于如何处理配置更改的开发指南 http://developer.android.com/guide/topics/resources/runtime-changes.html

编辑#2:首先,让我建议使用Imran的解决方案。它更好地遵循开发者指南,最终结果将是相同的。

现在,对于onConfigurationChanged解决方案。

看看你在onCreate上做了什么:

1)设置视图。 (此时隐藏了复选框。对吧?)

2)调用您的数据库并确定是否应显示复选框(编辑模式)

3)使所有复选框都可见。

现在,onConfigurationChanged也会调用setContentView,此时会再次隐藏所有复选框。因此,您需要重复使复选框可见的过程(上面的#3)。您可能不需要重复步骤#2,因为应保留该值,但我不确定您的应用程序的逻辑是如何工作的,因此可能需要重新执行步骤#2

这有意义吗?

答案 2 :(得分:0)

根据我的经验,getview似乎在最后被触发,这就是为什么'onRestoreInstanceState()'和'onConfigurationChanged()'无法使它成为getview将重置我的复选框在布局xml文件中初始化时不可见。

因此,我能找到的唯一解决方案是我必须在getview中控制它们以获得答案。