2017-03-16 55 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()并尝试。 – Paul

+0

@Paul它不起作用 – Curio

+1

我已经尝试了你的代码,但它工作正常。在选择模式下,函数onItemCheckedStateChanged()总是被调用。我仍然不知道问题出在哪里。如果您在选择模式中没有选择任何选项,它将退出选择模式。你总是选择同一件物品吗? – Paul

回答

0

,如果你创建在onItemCheckedStateChanged,呼叫总是叫你控制一个布尔值,但将一个具有控制这是可能的。

+0

我不明白 – Curio