2015-01-04 5 views
6

मेरे पास के साथ ActionBarActivity है।जब num.columns बदलते हैं तो मैं ग्रिडव्यू पर चयनित आइटम हाइलाइटिंग को कैसे बनाए रखूं?

GridView चित्र में 2 कॉलम और परिदृश्य में 3 कॉलम शामिल हैं।

जब मैं चित्र में आइटम चुनता हूं (मेरा ActionMode शुरू करता हूं) और फिर डिवाइस को घुमाएं, चयनित आइटम हाइलाइटिंग एक आइटम को बाईं ओर स्थानांतरित करता है। उदाहरण के लिए, यदि मैं दूसरा आइटम चुनता हूं और घूमता हूं, तो पहला आइटम हाइलाइट किया जाएगा। अगर मैं पहली वस्तु का चयन करता हूं और घूमता हूं, तो कोई आइटम हाइलाइट नहीं किया जाता है।

कोड में वास्तविक चयन सही है, केवल हाइलाइटिंग गलत है।

मुझे लगता है कि यह ऐसा नहीं करता है अगर मैं numcolumns को चित्र और परिदृश्य के लिए समान रखता हूं।

मेरा मानना ​​है कि इस मुद्दे पर होने वाली शुरू कर दिया के बाद मैं एक ActionBarActivity करने के लिए अपने गतिविधि बदल तो यह एक बग हो सकता है ..

किसी को जानते हो क्यों या कैसे इसे ठीक करने के?

+1

आप पोर्ट्रेट और लैंडस्केप मोड के लिए कॉलम नंबर को कैसे परिभाषित कर रहे हैं? –

+0

@ हार्डिक चौहान मैं लेआउट एक्सएमएल में ग्रिडव्यू के न्यूकॉलमर्स विशेषता का उपयोग कर रहा हूं और संख्या मेरी-प्लेआउट-भूमि संसाधन निर्देशिका में 3 और डिफ़ॉल्ट लेआउट संसाधन निर्देशिका में 2 के रूप में एक dimen मान है। – joepetrakovich

+0

ठीक है मुझे समाधान मिल गया है और आपको बताएं। –

उत्तर

5

मेरे पास एक समान परिदृश्य था और इस मुद्दे को हल करने के लिए boolean फ़ील्ड के साथ एक कस्टम ग्रिड आइटम बना रहा था ताकि यह पता चल सके कि आइटम का चयन किया गया है या नहीं और फिर कस्टम एडाप्टर के माध्यम से आइटम को उचित रूप से हाइलाइट करना है। नीचे मैंने जो किया है उसकी एक मोटा रूपरेखा है:

(1) मैंने boolean फ़ील्ड के साथ एक कस्टम ग्रिड आइटम बनाया है, जिसे हम सादगी के लिए selectedStatus पर कॉल करेंगे। मैं भी चयनित स्थिति पाने के लिए मेरी ग्रिड आइटम वर्ग के लिए इसी तरीकों कहा:

public boolean getSelectedStatus() 
{ 
    return selectedStatus; 
} 

public void setSelectedStatus (boolean paramSelectedStatus) 
{ 
    this.selectedStatus = paramSelectedStatus; 
} 

(2) मैं तो एक कस्टम Adapter कि extendsBaseAdapter मैं बनाए गए कस्टम ग्रिड वस्तु को संभालने के लिए बनाया। इस Adapter में मैं जाँच ग्रिड वस्तु के चयनित स्थिति true या false है और उसके अनुसार आइटम को हाइलाइट करता है, तो नीचे दिखाई गईं,

@Override 
public View getView (final int position, View convertView, ViewGroup parent) 
{ 

    // rest of getView() code... 

    if (!yourGridObject.getSelectedStatus()) 
    { 
     convertView.setBackgroundColor(Color.TRANSPARENT); 
    } 
    else 
    { 
     convertView.setBackgroundColor(Color.LTGRAY); 
    } 

    // rest of getView() code... 

    return convertView; 
} 

(3) अंत में, आप onItemClickListener चयनित स्थिति निर्धारित करने के लिए जोड़ सकते हैं और ग्रिड आइटम की पृष्ठभूमि का रंग जब वे चुने गए हैं (क्लिक किया):

yourGridView.setOnItemClickListener(new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) 
    { 
     YourGridObject yourGridObject = (YourGridObject) parent.getItemAtPosition(position); 
     if (!yourGridObject.getSelected()) 
     { 
      view.setBackgroundColor(Color.LTGRAY); 
      yourGridObject.setSelected(true); 
     } 
     else 
     { 
      view.setBackgroundColor(Color.TRANSPARENT); 
      yourGridObject.setSelected(false); 
     } 
    } 
}); 

चयन को लागू इस तरह से सुनिश्चित करता है कि ग्रिड मदों की हाइलाइटिंग (चयन) में परिवर्तन नहीं होगा स्तंभों और पंक्तियों की संख्या चयन के बाद से स्वैप करें स्थिति ग्रिड के भीतर निहित है खुद वस्तुओं।

3

आपको विलिस द्वारा सुझाए गए आइटमों के मैन्युअल रूप से चयन करने की आवश्यकता नहीं है। एंड्रॉइड पूरी तरह से समर्थन करता है कि आप क्या पूछ रहे हैं। मुझे लगता है कि आप ArrayAdapter का उपयोग कर रहे हैं हालांकि यह उत्तर सभी एडेप्टर पर लागू होगा। ध्यान दें कि कुछ एडाप्टर (जैसे CursorAdapter) आपकी पोस्ट की गई समस्या से पीड़ित नहीं होंगे और निम्न समाधान की आवश्यकता नहीं है क्योंकि यह पहले से ही आंतरिक रूप से कर रहा है।

समस्या दो भागों में हल हो गई है। एक, एडाप्टर स्थिर आईडी सक्षम करना चाहिए। दो, आपके एडाप्टर वास्तव में स्थिर आईडी वापस करना होगा। आपको ArrayAdapter या जो भी एडाप्टर आप उपयोग कर रहे हैं उसे विस्तारित करने की आवश्यकता होगी।फिर सुनिश्चित करें कि आपने नीचे दिखाए गए अनुसार निम्न विधियों को परिभाषित किया है।

private class MyAdapter extends ArrayAdapter<YourObjects> { 
    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    @Override 
    public long getItemId(int position) { 
     //Return a unique and stable id for the given position 
     //While unique, Returning the position number does not count as stable. 
     //For example: 
     return getItem(position).methodThatReturnsUniqueValue(); 
    } 
} 

अधिकांश एडाप्टर hasStableIds सक्षम नहीं करते हैं। यह मुख्य रूप से केवल एक विकल्प मोड सक्षम करते समय उपयोग किया जाता है। जो मुझे लगता है कि आप यहां कर रहे हैं। सत्य लौटकर, आप अनिवार्य रूप से एंड्रॉइड को सक्रिय (हाइलाइट किए गए) आइटमों को उनके आईडी नंबर के आधार पर उनके स्थिति संख्या के आधार पर ट्रैक रखने के लिए कह रहे हैं।

स्थिर आईडी सक्षम होने के साथ भी, आपको वास्तव में एक आईडी वापस करनी होगी जो स्थितित्मक परिवर्तनों में अद्वितीय और स्थिर हो। चूंकि अधिकांश एडेप्टर स्थिर आईडी सक्षम नहीं करते हैं, इसलिए वे आमतौर पर स्थिर आईडी के रूप में स्थिति संख्या को वापस कर देते हैं। तकनीकी रूप से, यदि किसी आइटम की स्थिति समय के साथ कभी नहीं बदलती है तो स्थिति संख्या "0" स्थिर आईडी के रूप में उपयोग की जा सकती है। हालांकि, स्थिर/अद्वितीय आईडी को वापस करने का सबसे सुरक्षित तरीका यह है कि एडाप्टर में संग्रहीत कक्षा ऑब्जेक्ट को असाइन किया गया हो और उस से खींचें।

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

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