2012-04-20 14 views
8

मेरे पास एक सूची दृश्य है जो आमतौर पर singleChoicechoiceMode है। जब उपयोगकर्ता किसी आइटम पर लंबे समय तक दबाता है, तो मैं एक एक्शन मोड दर्ज करना चाहता हूं जो एकाधिक आइटम चुनने की अनुमति देता है ताकि वे किसी भी चयनित आइटम पर कोई कार्रवाई कर सकें।सूची बदलें दृश्य विकल्प सिंगल चॉइस से एकाधिक चॉइसमोडल

मैं ListView को कॉन्फ़िगर करने में सक्षम हूं ताकि यह singleChoice मोड में हो और उपयोगकर्ता इसके बगल में एक विवरण खंड प्रदर्शित करने के लिए सूची आइटम का चयन कर सके और सूची आइटम स्वयं सक्रिय स्थिति में दिखाया जा सके।

मैं भी ListView कॉन्फ़िगर करने के लिए इतना है कि यह multipleChoiceModalchoiceMode में है और एक आइटम पर एक लंबे प्रेस प्रदर्शन कर कार्रवाई मोड शुरू होता है और एकाधिक चयन की अनुमति देता है, लेकिन अब ListView सामान्य में एक भी चयन अनुमति नहीं दी जाएगी कर रहा हूँ मोड (कोई एक्शन मोड नहीं)।

मेरे पास एक सूची दृश्य कैसे हो सकता है जो singleChoice मोड में है और फिर इसे किसी आइटम को लंबे समय दबाए जाने पर multipleChoiceModal मोड में स्थानांतरित करें?

यह निकटतम मैं साथ आने के लिए कर लिया है है:

  1. singleChoice मोड में ListView सेट
  2. सेट ListView के OnItemLongClickListener और है कि श्रोता में:
    1. ListView के OnItemLongClickListener सेट null
    2. सूची दृश्य देखें choiceMode से multipleChoiceModal
    3. उस आइटम पर view.performClick() पर कॉल करें जो लंबे समय तक दबाया गया था।

यह दृष्टिकोण एक जोड़े समस्या है।

  1. कार्रवाई मोड तब तक शुरू नहीं हुआ जब तक कि मैं किसी आइटम पर लंबे समय तक दबा नहीं जाता।
  2. जब मैं में getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); पर कॉल करता हूं तो मुझे java.lang.StackOverflowError मिलता है क्योंकि यह विधि क्रिया मोड को भी नष्ट करने की कोशिश कर रही है (लेकिन हम अभी तक नष्ट से वापस नहीं आये हैं)।
+0

आप multipleChoiceMode दर्ज करने के बाद क्या होता है, तो 2 चयनित और singleCheckMode के लिए वापस जाना है? – user387184

उत्तर

3

मैं अपने कार्यक्रमों

हमें ListView.CHOICE_MODE_MULTIPLE_MODAL में से एक में यह प्रयोग किया जाता है तो lv.setMultiChoiceModeListener(new ModeCallBack());

public class ModeCallBack implements ListView.MultiChoiceModeListener{ 

    View mSelectView; 
    TextView mSelectedCount; 
    ArrayList<Long> mCheckedItems; 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
     SharedPreferences.Editor edit = pref.edit(); 

     if(item.getItemId() == R.id.bowler_delete){ 

      for(int i=0; i<mCheckedItems.size(); i++){ 
       long id = mCheckedItems.get(i); 

       getActivity().getContentResolver().delete(BowlersDB.CONTENT_URI,BowlersDB.ID+"="+id,null); 
      } 
     }else if(item.getItemId() == R.id.bowler_add_ball){ 
      if(mCheckedItems.size() > 1){ 
       Toast.makeText(getActivity(),"Can only add bowling balls to one bowler at a time",Toast.LENGTH_SHORT).show(); 
      }else{ 
       edit.putLong(Preferences.BOWLER_SELECTED_FOR_BALL,mCheckedItems.get(0)).commit(); 

       ListFragment lf = new ManufacturersList(); 
       FragmentTransaction ft; 
       ft = getFragmentManager().beginTransaction(); 
       ft.replace(R.id.frameOne, lf).addToBackStack(null).commit(); 
       //mRemover.rFragment(); 
      } 
     }else if(item.getItemId() == R.id.add_bowler_to_team){ 
      for(int i=0; i<mCheckedItems.size(); i++){ 

       long id = mCheckedItems.get(i); 
       ContentValues values = new ContentValues(); 
       values.put(TeamBowlers.BOWLER_ID,id); 
       values.put(TeamBowlers.TEAM_ID,pref.getLong(Preferences.TEAM_SELECTED,1)); 
       getActivity().getContentResolver().insert(TeamBowlers.CONTENT_URI, values); 

      } 
      FragmentManager fm = getFragmentManager(); 
      fm.popBackStack(); 
     } 
     mode.finish(); 
     return true; 
    } 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     MenuInflater inflate = getActivity().getMenuInflater(); 
     if(fromTeam){ 
      inflate.inflate(R.menu.bowlers_team_action_menu, menu); 
     }else{ 
      inflate.inflate(R.menu.bowler_action_menu, menu); 
     } 
     if(mSelectView == null){ 
      mSelectView = (ViewGroup)LayoutInflater.from(getActivity()).inflate(R.layout.select_count_layout,null); 

      mSelectedCount = (TextView)mSelectView.findViewById(R.id.count_tv); 

     } 
     if(mCheckedItems == null){ 
      mCheckedItems = new ArrayList<Long>(); 
     } 
     mode.setCustomView(mSelectView); 
     return true; 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
     mCheckedItems = null; 

    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     if(mSelectView == null){ 
      mSelectView = (ViewGroup)LayoutInflater.from(getActivity()).inflate(R.layout.select_count_layout,null); 

      mSelectedCount = (TextView)mSelectView.findViewById(R.id.count_tv); 
     } 

     if(mCheckedItems == null){ 
      mCheckedItems = new ArrayList<Long>(); 
     } 
     return true; 
    } 

    @Override 
    public void onItemCheckedStateChanged(ActionMode mode, int position,long id, boolean checked) {   

     final int count = lv.getCheckedItemCount(); 
     mSelectedCount.setText(String.valueOf(count)); 
     if(checked){ 
      mCheckedItems.add(id); 
     }else{ 
      mCheckedItems.remove(id); 
     } 
    } 

} 

इस एक विकल्प एकल सूचीदृश्य क्लिक करें और लंबे क्लिक कई चयन के लिए अनुमति देता है। यह सब आईसीएस मैसेजिंग ऐप से खींचा गया था ताकि आप उसे भी ब्राउज़ कर सकें

+0

शायद मुझे कुछ याद आ रहा है, लेकिन कार्रवाई मोड नष्ट होने के बाद सूची सिंगल चॉइसमोड में कैसे जाती है? –

+0

सूचीदृश्य में 'onListItemClick' को ओवरराइड करें, फिर जब उपयोगकर्ता सूचीदृश्य में आइटम पर क्लिक करता है तो क्लिक से संबंधित टुकड़ा दिखाता है। जब तक मैं यहाँ कुछ याद नहीं कर रहा हूँ? – tyczj

+0

मुझे लगता है कि जिस हिस्से का मैंने उल्लेख नहीं किया है वह यह है कि मेरी सूची वस्तुएं राज्य_एक्टिवेटिव का लाभ लेती हैं। state_activated केवल तभी सत्य पर सेट किया जाता है जब आइटम को सिंगल चॉइस मोड में पसंद के रूप में चुना जाता है, इसलिए मैं वास्तव में अपनी सूची दृश्य को सिंगल चॉइस मोड में बदलना चाहता हूं। –

5

यह वास्तव में इस विकल्प मोड स्विच को अजीब लग रहा था क्योंकि कोई साफ और सरल समाधान नहीं है जिसे मैं Google कर सकता हूं। एकल मोड विकल्प में)

1.Start और सभी श्रोताओं सेट (यह किया जाता है, जहां आप सूची एडाप्टर सेट)

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
listView.setOnItemLongClickListener(liListener); 
listView.setMultiChoiceModeListener(mcListener); 
; HFM और KISS (विश्वास आदमी है) (यह सरल रखने बेवकूफ) की मदद की

2।विकल्प मोड के बीच स्विच करने के लिए इंटरफेस को लागू करें। इसे काम करने के लिए ट्रिक कार्यान्वयन के बाहर एकल विकल्प मोड पर वापस स्विच करना है, जिसका मतलब है कि आप कार्रवाई मोड को नष्ट कर देते हैं !! तो सीएबी विनाश को चिह्नित करने के लिए बस एक साधारण ध्वज का उपयोग करें। एक और चाल झूठी वापसी करने के लिए है ItemLong क्लिक करें ताकि पसंद मोड में प्रभावी होने का समय हो।

private OnItemLongClickListener liListener = new OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, 
       int position, long id) {     
      listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
      isCABDestroyed = false;     
      return false; // so this action does not consume the event!!! 
     } 
    }; 

private MultiChoiceModeListener mcListener = new MultiChoiceModeListener() { 
    @Override 
    public void onItemCheckedStateChanged(ActionMode mode, int position, 
              long id, boolean checked) { 
     final int checkedCount = listView.getCheckedItemCount(); 
     switch (checkedCount) { 
      case 0: 
       mode.setSubtitle(null); 
       break; 
      case 1: 
       mode.setSubtitle("One item selected"); 
       break; 
      default: 
       mode.setSubtitle("" + checkedCount + " items selected"); 
       break; 
     } 
    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.delete: 
       //do your action command here 
       mode.finish(); 
       return true; 
      default: 
       return false; 
     } 
    } 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     MenuInflater inflater = mode.getMenuInflater(); 
     inflater.inflate(R.menu.context_menu, menu); 
     return true; 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
     isCABDestroyed = true; // mark readiness to switch back to SINGLE CHOICE after the CABis destroyed 

    } 

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

3.Here स्विच वापस

@Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     if(isCABDestroyed) { 
      listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      //do your action command here 
     } 
     l.setItemChecked(position, true); 

    } 
+0

एक पुरानी पोस्ट वापस लाने के लिए खेद है, लेकिन मैंने ऊपर वर्णित तरीके से प्रयास किया है लेकिन मेरी सूची देखें आइटम नीली हाइलाइट नहीं हैं (व्हाट्सएप पर)। मैं ऐसा कैसे कर सकता हूं? धन्यवाद ! – Leonardo

+0

यदि यूआई को नेविगेट करने की आवश्यकता है और मनोरंजन के माध्यम से वापस लौटना आवश्यक है (उदाहरण के लिए, जब यूआई फ्रैगमेंट पर आधारित होता है), सूची सूची को 'ListView.CHOICE_MODE_SINGLE' पर स्विच करना न भूलें, अगर यह दूर जाने के पल पर' ListView.CHOICE_MODE_MULTIPLE_MODAL' में था। साथ ही, मल्टी से सिंगल तक चयन डायरिंग स्विचिंग रखें। मुझे यह पसंद है: यदि (! IsCABDestroyed) { \t int चयन = contentList.getCheckedItemPositions()। KeyAt (0); \t contentList.setChoiceMode (ListView.CHOICE_MODE_SINGLE); \t contentList.setItem चेक (चयन, सत्य); } // नेविगेशन दूर करें – StAlex

संबंधित मुद्दे