हाँ, एक iOS डेवलपर के दृष्टिकोण से, मुझे लगता है कि यह जैसी सुविधाओं के लागू करने के लिए "सेट डिफ़ॉल्ट चयन जब शुरू करने" और "चयन स्थिति याद उपयोगकर्ता क्लिक किया पंक्ति के बाद" ListView के लिए बेहद मुश्किल है।
तो चलो से शुरू करते हैं "चयन को याद" first.The समस्या यह है कि भले ही आप जानते हैं कि आप को उजागर/दबाया/फोकस कि शैली style.But परिभाषित करने के लिए चयनकर्ता एक्सएमएल उपयोग कर सकते हैं उपयोगकर्ता के बाद रखा जाना नहीं जाएगा उस पंक्ति पर क्लिक किया।उदाहरण के लिए, मैं इस तरह एक हाइलाइटिंग चयनकर्ता एक्सएमएल (res/drawable फ़ोल्डर के अंतर्गत list_selector.xml) है (लेकिन आप अन्य क्षेत्रों पंक्ति में TextView के पाठ का रंग की तरह हाइलाइट करने के लिए हो सकता है):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_selector_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/list_selector_pressed" android:state_selected="true" />
</selector>
और list_selector_pressed। एक्सएमएल जो हाइलाइटिंग शैली में परिभाषित किया गया - सेट पृष्ठभूमि रंग एक ग्रे रंग के लिए:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/dark_gray" />
</shape>
</item>
</layer-list>
तो @ दाऊद Hedlund के रूप में सुझाव:
बल्कि, एक OnItem आवंटित क्लिक लिस्टनर, और इसे चयनित आइटम की आईडी को कुछ चर में स्टोर कर दें।
private View currentSelectedView;
तो
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}
currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}
सुंदर सरल करने के लिए जाना:
आप अपने वर्ग के शीर्ष पर एक उदाहरण चर बनाने के लिए की जरूरत है हम जाँच अगर currentSelectedView अशक्त या वर्तमान क्लिक किया दृश्य है या नहीं। हम पहली बार विधि unhighlightCurrentRow (currentSelectedView) को कॉल करके किसी भी शैली को हाइलाइट करने के लिए --- आप सोच सकते हैं कि हम तत्काल परिवर्तनीय वर्तमान क्यों देखते हैं पैरामीटर के रूप में चयनित, मैं इसे बाद में समझाऊंगा। फिर हम वर्तमान चयन दृश्य को देखते हैं और वर्तमान पंक्ति को हाइलाइट करते हैं; ताकि उपयोगकर्ता के क्लिक करने के बाद शैली जारी रहेगी।
private void unhighlightCurrentRow(View rowView) {
rowView.setBackgroundColor(Color.TRANSPARENT);
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.white));
}
private void highlightCurrentRow(View rowView) {
rowView.setBackgroundColor(getResources().getColor(
R.color.dark_gray));
TextView textView = (TextView) rowView.findViewById(R.id.menuTitle);
textView.setTextColor(getResources().getColor(R.color.yellow));
}
आह, यही है। इस प्रकार हम सूची दृश्य के लिए "चयन याद रखें" को कार्यान्वित करते हैं। जैसा कि आप देख, हम दोनों एक्सएमएल और जावा कोड में स्टाइलिंग के लिए कोड नकल करने के लिए है - बहुत बेवकूफ :(
के बारे में "सेट डिफ़ॉल्ट चयन" अगला आप सोच सकते आप कर सकते हैं कि इस
।
listView.setAdapter(adatper)
listView.setSelection(0);
currentSelectedView = listView.getChildAt(0);
highlightCurrentRow(currentSelectedView);
गतिविधि या onActivityCreated() में onCreate() में
टुकड़ा में।
लेकिन अगर आप इसे चलाने के लिए, आप NullPointer अपवाद और क्यों मिलेगा? क्योंकि इस समय, सूचीदृश्य अभी तक गाया नहीं है और एंड्रॉयड नहीं है आईओएस की तरह जो व्यूविलपियर है। इसलिए आपको यह याद रखने के लिए एक त्वरित चर बनाना है कि यह है या नहीं पहली बार सूचीदृश्य सेल रेंडर करने के लिए और onListItemClick में उस चर अनसेट करने के लिए:
private Boolean firstTimeStartup = true;
तो विधियों को जोड़ने:
तो currentSelectedView घोषणा के तहत लगता है हम सूची दृश्य में पहली पंक्ति हाइलाइट करना चाहते हैं:
public class HomeAdapter extends ArrayAdapter<String> {
int layoutResourceId;
public HomeAdapter(Context context, int textViewResourceId,
ArrayList<String> objects) {
super(context, textViewResourceId, objects);
layoutResourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
layoutResourceId, null);
}
if (firstTimeStartup && postion == 0) {
highlightCurrentRow(convertView);
} else {
unhighlightCurrentRow(convertView);
}
TextView title = (TextView) convertView
.findViewById(R.id.menuTitle);
title.setText(getItem(position));
return convertView;
}
}
बहुत आसान।
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if (firstTimeStartup) {// first time highlight first row
currentSelectedView = l.getChildAt(0);
}
firstTimeStartup = false;
if (currentSelectedView != null && currentSelectedView != v) {
unhighlightCurrentRow(currentSelectedView);
}
currentSelectedView = v;
highlightCurrentRow(currentSelectedView);
//other codes
}
ये लीजिए: लेकिन आप onListItemClick विधि में कुछ बदलाव करने की जरूरत है! एंड्रॉइड का आनंद लें :)
मैंने पहले से ही वापस आने पर setSelection() का उपयोग करने का प्रयास किया है, लेकिन यह कोई अच्छा नहीं है - सभी पंक्तियों में से सभी को बिल्कुल भी हाइलाइट नहीं किया गया है (कोई पृष्ठभूमि रंग नहीं), और दूसरी पंक्ति स्क्रीन के शीर्ष पर स्थित है हालांकि जब मैं छोड़ा तो यह मध्य में कहीं स्थित था। धन्यवाद। – WhiteTigerK
एक और बात - एक संपर्क का चयन करने के लिए ट्रैकबॉल का उपयोग करते समय डिवाइस की संपर्क सूची में और उसके विवरण देखने के लिए ट्रैकबॉल दबाएं, संपर्क सूची की स्थिति सहेजी जाती है, इसलिए संपर्क सूची पर वापस जाने पर संपर्क अभी भी चुना जाता है और इसकी स्क्रीन में स्थान वही है। इसलिए मुझे लगता है कि यह व्यवहार हासिल करना संभव है। धन्यवाद। – WhiteTigerK
हां, चुनिंदा स्थिति सहेजी जाएगी, लेकिन यदि किसी भी समय आप स्क्रीन को स्पर्श करते हैं तो आप * टच मोड * टॉगल करेंगे और जब टच मोड में, जैसा कि आपने पहले ही देखा है, किसी आइटम को चुनने के लिए कोई दृश्य प्रतिक्रिया नहीं है (जब आइटम छुआ जा रहा है तो केवल संक्षिप्त प्रतिक्रिया, जो तब हो रहा है जब आप सूचीदृश्य पर वापस आएं)। यह पहले गलत व्यवहार है। इसे मत बदलें –