2014-06-18 2 views
2

방향 변경시 동작 모드의 상태를 복원하려고합니다. 하지만 제대로 작동하지 않습니다. # 3, # 4 선택에, 단계 아래의 순서를 따라가 손상받을 :방향 변경시 항목 선택 유지

  1. 긴 항목을 클릭 - 항목이 강조 표시, 상황에 맞는 작업 표시 줄이 제목으로 표시하는 것은 "선택 1"을 보여줍니다. 좋아 보인다.
  2. 휴대 전화를 가로 방향으로 돌리십시오. 변경되지 않습니다. 좋아 보인다.
  3. 세로로 다시 전화를 돌려
  4. - 항목이 강조되지 않고, 상황에 맞는 작업 표시 줄이 사라
  5. 긴 항목을 클릭 - 항목을 상황에 맞는 작업 표시 줄이 제목을 보여줍니다 강조

myListView.getCheckedItemCount() "0 선택"이 표시됩니다 onSaveInstanceState()에서 # 3에서 0을 반환합니다. 그것이 바로 문제가 시작되는 곳입니다.

(지원 라이브러리를 사용하여) 어떤 부분에서 잘못 했습니까?

@Override 
public void onSaveInstanceState(Bundle outState) { 
    //check if any items are selected 
    if (myListView.getCheckedItemCount() > 0) { 
     //get the list of selected items and convert it to an int Array 
     //because SparseBooleanArray cannot be stored in a bundle 
     SparseBooleanArray selectedItems = myListView.getCheckedItemPositions(); 
     int[] selectedItems_intArray = new int[myListView.getCheckedItemCount()]; 
     for (int i = 0; i < selectedItems.size(); i++) { 
      if (selectedItems.valueAt(i) == false) 
       continue; 
      selectedItems_intArray[i] = selectedItems.keyAt(i); 
     } 
     outState.putIntArray(KEY_CHECKED_ITEMS, selectedItems_intArray); 
    } 
} 

@Override 
public void onViewStateRestored(Bundle savedInstanceState) { 
    super.onViewStateRestored(savedInstanceState); 
    if (savedInstanceState != null) { 
     int[] checkedItems = savedInstanceState.getIntArray(KEY_CHECKED_ITEMS); 
     if (checkedItems != null) { 
      actionMode = ((ActionBarActivity) getActivity()).startSupportActionMode(new ContextualActionBarActionModeCallBack()); 

      for (int i = 0; i < checkedItems.length; i++) { 
       myListView.setItemChecked(checkedItems[i], true); 
      } 

      actionMode.setTitle(myListView.getCheckedItemCount() + " selected"); 
     } 
    } 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    myListView = (ListView) getActivity().findViewById(R.id.myListView); 
    adpt = new myCustomCursorAdapter(getActivity()); 
    myListView.setAdapter(adpt); 
    //Choice mode is allowed only after a long click 
    //disabling it on first time load 
    myListView.setChoiceMode(ListView.CHOICE_MODE_NONE); 
     myListView.setOnItemLongClickListener(new OnItemLongClickListener(){ 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id){ 
      if(actionMode == null){ 
       //Start the action mode 
       actionMode = ((ActionBarActivity)getActivity()).startSupportActionMode(new ContextualActionBarActionModeCallBack()); 

       myLisVIew.setItemChecked(position, true);       
       actionMode.setTitle(myListView.getCheckedItemCount() + " selected"); 
       return true; 
       } 
      else return false; 
     } 
    }); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    getLoaderManager().initLoader(0,null,this); 
} 

private class ContextualActionBarActionModeCallBack implements ActionMode.Callback{ 
    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     MenuInflater inflater = mode.getMenuInflater(); 
     inflater.inflate(R.menu.mycontextmenu, menu); 
     myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    } 
    ... 
    ... 
} 

의 ListView 레이아웃 요소 :

<ListView 
     android:id="@+id/myListView" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:layout_alignParentTop="true" 
     android:listSelector="@android:color/transparent" 
     android:stackFromBottom="true" 
     android:layout_above="@id/layout_input" 
     android:divider="#00000000" 
     /> 

답변

7

문제는 목록보기의 선택 모드가되는 리셋 목록보기가 방향 변경에 생성됩니다 CHOICE_MODE_NONE마다의 기본 인 것이 때문에 선택 모드가 목록보기 레이아웃 파일에 명시 적으로 정의되지 않았습니다. 이 경우 Android 소스에서 - http://androidxref.com/4.4.2_r2/xref/frameworks/base/core/java/android/widget/AbsListView.java#815.

android:choiceMode="multipleChoice" 

목록보기 레이아웃 :

이 솔루션은 추가하는 것입니다.

이렇게하면 목록보기 선택 항목을 수동으로 onSaveInstanceState()에 저장하고 onViewStateRestored()에서 검색 할 필요가 없습니다. 조각에 의해 자동으로 수행됩니다. 따라서이 두 기능을 모두 제거하십시오. 그냥 onResume의 동작 모드를 시작

@Override 
    public void onResume() { 
     super.onResume(); 
      getLoaderManager().initLoader(0,null,this); 
      if (myListView.getCheckedItemCount() > 0 && actionMode == null) { 
      actionMode = ((ActionBarActivity) getActivity()).startSupportActionMode(new ContextualActionBarActionModeCallBack()); 
      actionMode.setTitle(myListView.getCheckedItemCount() + " selected"); 
     } 
    } 

참고 : 당신은 LoaderManager.LoaderCallBacks 인터페이스를 구현 한 당신은 어댑터가로드 된 후 onLoadFinished()에 그것을 단지 방향 변경 후 어댑터 항목에 액세스해야하는 경우 데이터 소스 onResume()에서 수행하면 NPE이됩니다.

+0

android : configChanges = "orientation | screenSize"를 사용하고 있기 때문에 오리엔테이션 변경에서 내 활동 및 조각이 재생성되지 않으므로 listview도 다시 작성하면 안됩니다. – JosephM

관련 문제