मैं एक एडाप्टर उपयोग कर रहा हूँ और कस्टम पृष्ठभूमि रंग सेट है, लेकिन एंड्रॉयड उपयोग करने के लिए नहीं करना चाहता था: 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;
};
यहाँ एडाप्टर के लिए मेरे कोड है
नहीं, सेट चयन (pos) मेरी समस्या का समाधान नहीं करता है! डिवाइस टच मोड में नहीं है, लेकिन फिर भी मुझे बैकगाउंड हाइलाइटिंग नहीं मिलती है। मैं बस एक एमुलेटर पर परीक्षण कर रहा हूँ। मेरी सूची दृश्य एक चयनकर्ता xml का उपयोग कर रहा है, उम्मीद है कि इसका कोई प्रभाव नहीं है! – kiki
आप कैसे जानते हैं कि आपका डिवाइस टच मोड में नहीं है? शायद आप बटन को हाइलाइट करने के लिए नेविगेशन कुंजी का उपयोग करने का प्रयास कर सकते हैं और बटन दबाए रखने के लिए केंद्र कुंजी का उपयोग कर सकते हैं। देखें कि इससे कोई फर्क पड़ता है या नहीं। – onlygo
मैं अब ग्रहण में एमुलेटर के साथ काम कर रहा हूं। और काम करने के लिए मेरे पीसी के कीबोर्ड का उपयोग कर। – kiki