2010-10-08 21 views
15

एक गतिविधि में एक बटन और एक सूची दृश्य है। प्रारंभ में, केवल बटन दिखाई दे रहा है। जब बटन दबाया जाता है, तो सूची दृश्य प्रदर्शित होता है। प्रदर्शित होने पर, क्या मेरे लिए एक विशेष आइटम को चयनित/केंद्रित के रूप में दिखाना संभव है?एंड्रॉइड: सूची दृश्य के रूप में चुने गए आइटम को सेट करने के लिए?

एक उपयोग केस यह माना जा सकता है कि यह भाषा सेटिंग्स की एक सूची है और जब सूची खुलती है, तो वर्तमान में चयनित भाषा को हाइलाइट किया जाना चाहिए।

यदि मुझे आइटम की अनुक्रमणिका पता है, तो इसे डिस्प्ले पर केंद्रित के रूप में कैसे सेट करें?

उत्तर

15

संक्षेप में, ListView :: setSelection (int position) आपको जो चाहिए वह है। हालांकि, डिवाइस टच मोड में है या नहीं, इस पर निर्भर करता है कि यह दृश्य प्रभाव (पृष्ठभूमि हाइलाइटिंग) हो सकता है या नहीं। अधिक जानकारी के लिए, आप अपने लिए एक Adapter का उपयोग करते हैं Android ListView Selection Problem

+1

नहीं, सेट चयन (pos) मेरी समस्या का समाधान नहीं करता है! डिवाइस टच मोड में नहीं है, लेकिन फिर भी मुझे बैकगाउंड हाइलाइटिंग नहीं मिलती है। मैं बस एक एमुलेटर पर परीक्षण कर रहा हूँ। मेरी सूची दृश्य एक चयनकर्ता xml का उपयोग कर रहा है, उम्मीद है कि इसका कोई प्रभाव नहीं है! – kiki

+0

आप कैसे जानते हैं कि आपका डिवाइस टच मोड में नहीं है? शायद आप बटन को हाइलाइट करने के लिए नेविगेशन कुंजी का उपयोग करने का प्रयास कर सकते हैं और बटन दबाए रखने के लिए केंद्र कुंजी का उपयोग कर सकते हैं। देखें कि इससे कोई फर्क पड़ता है या नहीं। – onlygo

+0

मैं अब ग्रहण में एमुलेटर के साथ काम कर रहा हूं। और काम करने के लिए मेरे पीसी के कीबोर्ड का उपयोग कर। – kiki

11

का उल्लेख ListView अपने एडाप्टर के लिए इस कोड जोड़ें:

public class MyAdapter extends ArrayAdapter<MyClass> { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater inflator = (LayoutInflater) getContext() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      rowView = inflator.inflate(R.layout.my_adapter, null); 
     } else { 
      rowView = (View) convertView; 
     } 

     //... 

     // set selected item 
     LinearLayout ActiveItem = (LinearLayout) rowView; 
     if (position == selectedItem){ 
      ActiveItem.setBackgroundResource(R.drawable.background_dark_blue); 

      // for focus on it 
      int top = (ActiveItem == null) ? 0 : ActiveItem.getTop(); 
      ((ListView) parent).setSelectionFromTop(position, top); 
     } 
     else{ 
      ActiveItem.setBackgroundResource(R.drawable.border02); 
     }  
    } 

    private int selectedItem; 

    public void setSelectedItem(int position) { 
     selectedItem = position; 
    }  
} 

अपने Activity में:

myAdapter.setSelectedItem(1); 
+0

सेट दोस्त चयन –

37

मैं अपने समाधान पोस्ट, क्योंकि गूगल अभी भी जवाब नहीं जानता है।

getListView().setItemChecked(selectedGroupIndex, true); 
+0

वोट +1 काम करता है यह मेरे लिए काम नहीं करता है, क्या आप कृपया विस्तारित कर सकते हैं? क्या यह अभी भी 2018 में प्रासंगिक है? – radistao

+1

के बजाय इस पोस्ट को उत्तर के रूप में स्वीकार करने के लिए महान दोस्त –

0

मैं एक एडाप्टर उपयोग कर रहा हूँ और कस्टम पृष्ठभूमि रंग सेट है, लेकिन एंड्रॉयड उपयोग करने के लिए नहीं करना चाहता था: drawable एक्सएमएल में state_selected। SetSelection मेरे लिए काम नहीं करता है, लेकिन शायद यह भी है क्योंकि मुझे SetNotifyDataChanged की आवश्यकता है जो दर्शाता है कि चयनित राज्य लगातार नहीं है।

मैंने यह भी पाया कि ListView में किसी आइटम के लिए चयनित स्थिति लगातार नहीं है, क्योंकि SetNotifyDataChanged परिणाम सूची दृश्य लेआउट को अद्यतन करने में परिणाम देता है जो उन्हें साफ़ करता है। एडाप्टर के GetView में चयनित आइटम को सेट करना भी बहुत जल्द है।

आखिरकार मैंने चयनित आइटम के दृश्य के लिए चयनित स्थिति को सेटव्यू के लेआउट के बाद चयनित स्थिति को बदल दिया है, जो तब होता है जब लेआउट चेंज इवेंट ट्रिगर किया जा रहा है (जावा में यह शायद सूची दृश्य के ऑनलेआउट चेंजलिस्ट को जोड़ रहा है)।

इसे वास्तव में आसान बनाने के लिए मैं चयनित आइटम के दृश्य को एडाप्टर के चयनित इटिम व्यू के रूप में संग्रहीत करता हूं। ListView के लेआउट चेंज eventhandler में मैंने बस एडाप्टर के चयनित ItemView सेट किया है। सत्य पर चयन किया गया।

public class RingTonesListAdapter : BaseAdapter<RingToneItem> 
{ 
    List<RingTone> Items { get; set; } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     View view = convertView; 

     // re-use an existing view, if one is available 
     // otherwise create a new one 
     if (view == null) 
     { 
      view = Context.LayoutInflater.Inflate(Resource.Layout.AlertSoundItem, parent, false); 
      view.Click += SelectRingTone; 
     } 

     RingTone ringTone = this[position]; 
     if (ringTone.Selected) 
     { 
      //==> Important 
      //Store this view since it's the view for the Selected Item 
      SelectedItemView = view; 
      //Setting view.Selected to true here doesn't help either, since Selected will be cleared after. 
     } 

     return view; 
    } 

    private void SelectRingTone(object sender, EventArgs args) 
    { 
     View view = (View)sender; 
     string title = view.FindViewById<TextView>(Resource.Id.ringToneTitle).Text; 
     RingToneItem ringToneItem = Items.First(rt => rt.Title == title); 
     if (!ringToneItem.Selected) 
     { 
      //The RingTone was not selected and is selected now 
      //Deselect Old and Select new 
      foreach (RingToneItem oldItem in Items.Where(rt => rt.Selected)) 
      { 
       oldItem.Selected = false; 
      } 

      // Select New RingTone 
      ringToneItem.Selected = true; 
      //Update the ListView. 
      //This will result in removal of Selected state for all Items when the ListView updates it's layout 
      NotifyDataSetChanged(); 
     } 

     //Now play the test sound 
     NotifierService.TestSound(Context, ringToneItem); 
    } 

    public View SelectedItemView { get; set; } 
} 
:

यहाँ मेरी गतिविधि से कोड है, जहां मैं ListView के लिए एडाप्टर सेट करते हैं और LayoutChange की सदस्यता (या जावा में एक OnLayoutChangeListener देते हैं)

 ringTonesListView.Adapter = ringTonesListAdapter; 
     ringTonesListView.LayoutChange += (s, layoutChangeArgs) => { 
      //At this stage the layout has been updated and the Selected can be set to true for the view of the selected item. This will result in android:state_selected logic to be applied as desired and styling can be completely done per layout in Resources. 
      ringTonesListAdapter.SelectedItemView.Selected = true; 
     }; 

यहाँ एडाप्टर के लिए मेरे कोड है