2012-03-13 13 views
5

मेरे पास एक सूची दृश्य है जिसमें कस्टम पंक्तियां हैं। यह कस्टम पंक्ति UI तत्वसूची आइटम चयन पर दृश्य के गुण बदलें

निम्नलिखित है
  1. imageView imageView1, imageView2
  2. TextView textview1, textView2, textView3

आवश्यकता जब भी सूची पंक्ति का चयन किया जाता है वहाँ निम्नलिखित किया जाएगा बदल जाता

imageView1 पृष्ठभूमि, रंग बदल गया है

imageView1 रंग बदल गया है

textview1 रंग, आकार और टाइपफेस है बदलता है

textview2 रंग, आकार

बदल गया है textview3 रंग, आकार

बदल गया है इस के लिए डिजाइन करने के लिए सबसे अच्छा तरीका है क्या?

AFAIK हम चयनकर्ता में शैलियों को लागू नहीं कर सकते हैं। जावा कोड में संभालने के बजाय इस पर काम करने का कोई बेहतर तरीका है?

हम setOnItemSelectedListener सूचीदृश्य जो निम्नलिखित कॉलबैक तरीकों के लिए होता है पर सेट किया जा सकता है:

i) onItemSelected

ii) onNothingSelected

हालांकि वहाँ कोई कॉलबैक विधि है, जिसका विवरण प्रदान करना है वस्तु जिसने अपना ध्यान खो दिया है। क्या बदलाव करने के लिए यह एक बेहतर जगह है?

अग्रिम धन्यवाद।

+0

"AFAIK हम चयनकर्ता में शैलियों को लागू नहीं कर सकते हैं। क्या जावा कोड में संभालने के बजाय इस पर काम करने का कोई बेहतर तरीका है?" यदि आप इसे किसी चयनकर्ता में नहीं कर सकते हैं तो यह और कैसे किया जा सकता है लेकिन जावा में? हो सकता है कि आप डिफ़ॉल्ट चयनकर्ता द्वारा निर्दिष्ट शैली विशेषताओं को ओवरराइड कर सकें? – nmr

+0

पृष्ठभूमि रंग/खींचने योग्य बदलने के लिए शैलियों को लागू किया जा सकता है। यह फ़ॉन्ट आकार बदलने में मदद नहीं करेगा। क्या मुझे प्रत्येक बच्चे के विचारों के लिए चयनकर्ता निर्दिष्ट करने की आवश्यकता है? जावा कोड में, getView() के अंदर। –

उत्तर

2

मुझे लगता है कि तुम यहाँ करने के लिए एक Compound Control बनाने है चाहता हूँ। नमूने // एपीडीमोस उपनिर्देशिका में आप अपनी एसडीके निर्देशिका में एक उदाहरण पा सकते हैं (यदि आपके पास इन निर्देशिका नहीं हैं तो आप Android source डाउनलोड कर सकते हैं)।

मैं जो करता हूं वह एक वर्ग बनाता है जो आप अपनी कस्टम पंक्ति के लिए उपयोग कर रहे किसी भी प्रकार के लेआउट से प्राप्त होता है। मान लीजिए कि यह इस उदाहरण के लिए LinearLayout है। अपने उप-वर्ग कन्स्ट्रक्टर में, आप संसाधन से अपना लेआउट बढ़ा सकते हैं, सबव्यूज़ ढूंढ सकते हैं और उन्हें आवृत्ति चर से जोड़ सकते हैं, और लाइनरलाइट को कॉलर पर वापस कर सकते हैं।

इस सबक्लास में, आप setSelected ओवरराइड कर सकते हैं और जिस तरह से आप चाहते हैं सबव्यूज़ में हेरफेर कर सकते हैं। mycustomlayout में

public class MyCustomLayout extends LinearLayout { 
    public ImageView imageView1; // These are public since you likely want 
    public ImageView imageView2; // to set them in your Adapter. 
    public TextView textView1; 
    public TextView textView2; 
    public TextView textView3; 

    public MyCustomLayout(Context ctxt) { 
     super(ctxt); 

     // The call below attaches the items in the mycustomlayout.xml file to this 
     // instance, which serves as the root element in the layout. 
     LayoutInflater.from(ctxt).inflate(R.layout.mycustomlayout, this, true); 

     imageView1 = (ImageView)findViewById(R.id.imageview1); 
     imageView2 = (ImageView)findViewById(R.id.imageview2); 
     textView1 = (TextView)findViewById(R.id.textview1); 
     textView2 = (TextView)findViewById(R.id.textview2); 
     textView3 = (TextView)findViewById(R.id.textview3); 
    } 

    @Override 
    public void setSelected(boolean selected) { 
     super.setChecked(selected); 
     if (selected) { 
      imageView1.setBackgroundColor(0xFFFF0000); // whatever color you want 
      // Do all the rest of the setting of your subviews here for 
      // the case when the row is selected. 
     } else { 
      imageView1.setBackgroundColor(0xFF000000); // whatever color you want 
      // Do all the rest of the setting of your subviews here for 
      // the case when the row is not selected 
     } 
    } 
} 

अब,:

यहाँ मैं क्या अपनी पोस्ट के आधार पर वर्णन कर रहा हूँ का एक उदाहरण है।xml फ़ाइल, तुम इतनी है कि आप एक अनावश्यक लेआउट का निर्माण नहीं करतीं <merge> टैग का उपयोग करना चाहते हैं:

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ImageView 
     android:id="@+id/imageview1" /> 
    <ImageView 
     android:id="@+id/imageview2" /> 
    <TextView 
     android:id="@+id/textview1" /> 
    <TextView 
     android:id="@+id/textview2" /> 
    <TextView 
     android:id="@+id/textview3" /> 
</merge> 

मैं ऊपर subviews के सभी विन्यास elided किया है, जाहिर है, लेकिन आप के बारे में कैसे विचार मिलना चाहिए एक्सएमएल फ़ाइल सेट अप करने के लिए। यदि आप एक्सएमएल और लेआउट इनफ्लेटर के साथ बेवकूफ बनाना नहीं चाहते हैं तो आप इसे कोड में भी कर सकते हैं। आप Android dev ब्लॉग पर this helpful blog post देख सकते हैं जो अंत में एक समान केस पर चर्चा करता है।

फिर, अपनी एडाप्टर के getView तुम सिर्फ बना सकते हैं (या रीसायकल) MyCustomLayout के उदाहरण, उन्हें सेट अप, और ढांचे ट्रैक जिनमें से पंक्तियां चयनित हैं और जो चयनित नहीं हैं रखने की देखभाल करते हैं।

0

मेरे पास एक कच्चा तरीका है ... लेकिन यह बहुत ही प्रक्रिया है ... एक आइटम को चुनने के बाद आपकी सूचीदृश्य ताज़ा करें ... केवल चयनित आइटम के लिए इसे उस विशेष फ़ॉन्ट आदि को दिखाया जाना चाहिए ... और स्टोर आपके एडाप्टर में विचारों को पॉप्युलेट करते समय कुछ चर में चयनित आइटम की आईडी ...

0

गतिविधि स्तर पर एक स्थिर पूर्णांक चर selectedPos लें।

ऑनइटम में चयनित selectedPos = position और कुछ भी नहीं चुनने पर इसे -1 पर सेट करें और अपने एडाप्टर ऑब्जेक्ट के लिएडेटाडेट चेंज() को सूचित करें।

अब सूची दृश्य के एडाप्टर कक्षा में। के रूप में

if(position == selectedPos) 
{ 
    // set color and background to view 
} 

getView में लिखने हालत और, अनुकूलक कक्षा में इस दो तरीकों लिखने के लिए भूल जाते हैं न

@Override 
public int getItemViewType(int position) { 
return position; 
} 

@Override 
public int getViewTypeCount() { 
return _ArrayListObject.size(); 
} 
+0

धन्यवाद सोनी। हालांकि इसका मतलब सूची को फिर से निकालना होगा प्रत्येक चयनित आइटम के लिए फिर से देखें। क्या इससे किसी भी तरह से बचा जा सकता है? यह भी सूचित करें कि डेटासेट चैंग() को "अंतर्निहित डेटा बदल दिया गया है" कहा जाना चाहिए, जो यहां मामला नहीं है। क्या इस मामले को संभालने के लिए ढांचे से कोई समर्थन नहीं है? –

+0

@khotmanish nope .. :) :(.. मेरे पास सिर्फ यह विचार मेरे दिमाग में है और मुझे लगता है कि यह आपके लिए काम करेगा .. – MKJParekh

0

Khotmanish,

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

यदि आप इसे समय से पहले जानते हैं, तो आप बस प्रत्येक दृश्य के लिए एक स्टेटलिस्ट ड्रावेबल बना सकते हैं और इसे अपने एडाप्टर के माध्यम से चलाने के लिए प्रत्येक पर लागू कर सकते हैं।

अपने StateListDrawable बनाने के लिए, एक बना:

StateListDrawable _drawStates; 

फिर, प्रत्येक राज्य के लिए, आप की जरूरत drawable जोड़ें:

_drawStates.add(new int[] {android.R.attr.state_pressed}, _newImage); 

यह आपके getView में निम्न पंक्ति के रूप में सरल है () आपके एडाप्टर के लिए विधि:

v.setBackgroundDrawable(_drawStates); 

वैकल्पिक रूप से, आप पृष्ठभूमि को गतिशील रूप से बदल सकते हैं चयन के अनुसार। यह OnListItemClick() में किया जा सकता है। आप देखते हैं, OnListItemClick() आपको सटीक दृश्य देगा जो क्लिक किया गया है। एक बार आपके पास यह हो जाने के बाद, आप बच्चे को id से ढूंढ सकते हैं और इसकी गुणों को बदल सकते हैं और invalidate() इसे बदल सकते हैं। मैं इस चाल का बहुत उपयोग करता हूं। मुझे बहुत मेमोरी बचाता है, लेकिन मैं वास्तव में प्रोसेसर गहन कुछ भी नहीं कर रहा हूं। आप लगभग किसी भी प्रसंस्करण के बिना लगभग किसी भी संपत्ति को बदल सकते हैं। यहां एक उदाहरण दिया गया है:

@Override protected void onListItemClick(final ListView inList, final View v, final int atPos, final long rowID) 
{//Get the Child, set the properties 
    ImageView _img = (ImageView)(v.findViewById(R.id.app_package)); 
    _img.setBackgroundColor(myClickedColor); 
    _img.invalidate(); // <---- BEST Option 
// ... OR ... 
    v.invalidate();  // <---- 2nd Best Option 
// ... OR ... 
    inList.invalidate(); // <---- Last resort or specialized implementation 
} 

यह ध्यान रखना महत्वपूर्ण है कि पृष्ठभूमि रंगों की बात करते समय यह गतिशील रूप से कुछ चेतावनियां होती हैं। आपको बच्चे को क्लिक किए गए दृश्य से प्राप्त करना होगा ... सूची दृश्य नहीं। दूसरा, पृष्ठभूमि रंग बदलते समय, आप वास्तव में पृष्ठभूमि आरेखण बदल रहे हैं। इसका मतलब यह है कि अन्य सभी "राज्यव्यापी" गुण दूर हो जाते हैं और आपको इसे मैन्युअल रूप से बदलना होगा (यदि आप इसे शुरू करना चाहते हैं)।

अब, एक अधिक लोकप्रिय, लेकिन कुछ कम लचीला दृष्टिकोण एक्सएमएल में आपके स्टेटलिस्ट को हटाने योग्य है। एंड्रॉइड डेवलपर वेबसाइट पर इसे कैसे करना है, यह जानने के लिए कई संसाधन हैं।

आशा इस मदद करता है, FuzzicalLogic

+0

आपकी प्रतिक्रिया फ़जिकल लॉजिक के लिए धन्यवाद। हालांकि स्टेटलिस्ट ड्रेवेबल केवल रंग/ड्रॉबल्स बदल देगा। यह ' फ़ॉन्ट आकार बदलने के लिए बहुत मदद नहीं है। इसके अलावा मुझे ऑनक्टेड राज्य की बजाय राज्य का चयन करने में अधिक दिलचस्पी है। (मैं ऑन टच के बजाए ट्रैकबॉल का उपयोग करूँगा)। इसलिए onListItemClick मुझे इसके साथ मदद नहीं करेगा :(वैसे भी आपके संक्षिप्त उत्तर के लिए धन्यवाद :) –

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