2017-03-16 2 views
0

조각 클래스 :안드로이드 : onItemCheckedStateChanged가 호출 한 번만

public class MultiFragmentListContent extends ListFragment 
{ 
ListView listView; 
ActionMode actionMode; 
ArrayAdapter<String> arrayAdapter; 
List<String> stringList; 
Set<String> checkList; 
AbsListView.MultiChoiceModeListener choiceModeListener = null; 

@Override 
public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    super.onCreateView(inflater,container,savedInstanceState); 
    View rootView = inflater.inflate(R.layout.fragment, container, false); 
    return rootView; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 
    checkList = new HashSet<>(); 
    stringList = new LinkedList<>(); 
    stringList.add("A"); 
    stringList.add("B"); 
    stringList.add("C"); 
    stringList.add("D"); 
    stringList.add("E"); 
    listView = getListView(); 
    arrayAdapter = new ArrayAdapter<String>(getActivity(),R.layout.string,stringList); 
    listView.setAdapter(arrayAdapter); 

    choiceModeListener = new AbsListView.MultiChoiceModeListener() 
    { 
     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) 
     { 
      if(checked) 
       checkList.add(stringList.get(position)); 
      else 
       checkList.remove(stringList.get(position)); 
     } 

     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) 
     { 
      actionMode = mode; 
      MenuInflater menuInflater = mode.getMenuInflater(); 
      menuInflater.inflate(R.menu.contentmenu2,menu); 
      arrayAdapter = new ArrayAdapter<String>(getActivity(),R.layout.checkbox,stringList); 
      listView.setAdapter(arrayAdapter); 
      return true; 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      return true; 
     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) 
     { 
      switch(item.getItemId()) 
      { 
       case R.id.contextmenu2: 
        for(String k : checkList) 
        { 
         stringList.remove(k); 
         Log.i(k,k); 
        } 
        actionMode.finish(); 
        break; 
      } 
      return true; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode mode) 
     { 
      arrayAdapter = new ArrayAdapter<String>(getActivity(),R.layout.string,stringList); 
      listView.setAdapter(arrayAdapter); 
      checkList.removeAll(checkList); 
     } 
    }; 

    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    listView.setMultiChoiceModeListener(choiceModeListener); 

    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() 
    { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      listView.setMultiChoiceModeListener(choiceModeListener); 
      return true; 
     } 
    }); 

} 
} 

나는 방법 onItemCheckedStateChanged 한 번만이라고 지적했다.

이 메서드가 작동하기 전에 항상 호출되는 것을 의미합니다.

웹에서 찾으려고했지만 해결책을 찾지 못했습니다.

나는 문제가

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

하지만 난 어디에 넣어 모르는 생각합니다. 다른 장소에 넣으면 앱이 다운됩니다.

+1

setChoiceMode() 뒤에 adapter.notifyDataSetChanged()를 추가하고 try를 사용할 수 있습니다. – Paul

+0

@Paul 작동하지 않습니다. – Curio

+1

코드로 시도했지만 제대로 작동합니다. 선택 모드에서 onItemCheckedStateChanged() 함수는 항상 호출되었습니다. 나는 아직도 문제가 어디에 있는지 모른다. 선택 모드에서 아무 것도 선택하지 않으면 선택 모드가 종료됩니다. 당신은 항상 같은 항목을 선택 했습니까? – Paul

답변

0

onItemCheckedStateChanged에서 컨트롤에 대해 하나의 부울 값을 만드는 경우 호출이 항상 호출되지만 컨트롤을 가질 수 있습니다.

+0

나는 이해하지 못했다. – Curio