2012-02-14 31 views
36

तो मेरे पास 2 ListView विगेट्स के साथ एक गतिविधि है, जब आप पहले में कोई मान चुनते हैं, तो दूसरा पहले ListView में चयन से संबंधित मानों के साथ पॉप्युलेट किया जाता है। यह मैकेनिक बिना किसी समस्या के काम करता है, लेकिन अब मैं चाहता हूं कि उपयोगकर्ता विकल्प हाइलाइट रहें। मैं इस विषय से संबंधित प्रश्न का एक अच्छा राशि पढ़ा है और ऐसा लगता है तरीकों एक ऐसा कर सकते हैं के असंख्य लेकिन उन्हें की लगभग 4-5 कोशिश कर के बाद 'मैं अभी भी यह काम करने के लिए नहीं मिल सकता है।एंड्रॉइड - एक बार किसी पर क्लिक किए जाने पर ListView के आइटम को हाइलाइट किया गया

मैं इसे android:listSelector="#CCCCCC" एक्सएमएल गुण का उपयोग कर दूसरी ListView पर काम मिल गया है, लेकिन यह साफ किया जा करने के लिए एक बार एक OnItemClickListener मिश्रण में शुरू की है (एक मैं अपनी पहली ListView पर उपयोग की तरह) लगता है।

अब तक यहाँ मैं क्या कर लिया है:

कस्टम OnItemClickListener मैं इस विषय (थोड़ा क्रम में इसे संशोधित यह मेरी जानकारी दूसरा ListView लोड करने के लिए) के बारे में ब्राउज़िंग विभिन्न जवाब मिला:

private class ItemHighlighterListener implements OnItemClickListener { 

    private View oldSelection = null; 

    public void clearSelection() { 
     if(oldSelection != null) { 
      oldSelection.setBackgroundColor(android.R.color.transparent); 
     } 
    } 

    public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 
     clearSelection(); 
     oldSelection = view; 
     view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.list_selector)); 
     loadClubs(mXMLPortalOptions.getRegion(pos).getId()); 
     mClubList.setAdapter(new ArrayAdapter<String>(getApplicationContext(), R.layout.list_item_white, mClubs)); 
    } 
} 

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_selected="true"><shape> 
      <solid android:color="#CCCCCC" /> 
     </shape></item> 

    <item android:state_selected="false"><shape> 
      <solid android:color="#FFFFFF" /> 
     </shape></item> 

</selector> 

विधि (OnItemClick) एक कहा जाता है:

यहाँ मेरी list_selector.xml फ़ाइल है डी निष्पादित, लेकिन मेरे ListItem की पृष्ठभूमि एक ही रंग में रहती है:/

मुझे विश्वास नहीं है कि यह सरल कार्य इतना जटिल साबित हुआ है।

मैं कोड है कि उपयोगी हो सकता है या अगर मेरे सवाल का विवरण कमी है नहीं दिखाए हैं, तो बात करने के लिए है कि बाहर के लिए स्वतंत्र महसूस और मैं अपने आप को समझाने के लिए मेरी भरपूर प्रयास करेंगे।

+0

मुझे लगता है कि यह आपके द्वारा उपयोग किए जा रहे एसडीके के किस संस्करण से संबंधित है। – jsmith

+0

एपीआई स्तर 7 जो मैं उपयोग कर रहा हूं। –

+0

i.masm द्वारा पोस्ट में जो भी मैं सोच रहा था उसके लिए एक लिंक है। http://android-developers.blogspot.com/2008/12/touch-mode.html – jsmith

उत्तर

60

चयनित आइटम के लिए एक स्थिति चर रखो। onItemClicked() विधि में स्थिति बदलें। getView() अंदर सूची एडाप्टर में चयनित स्थिति की जाँच करें और चयनित आइटम के लिए पृष्ठभूमि निर्धारित किया है।

public class TestAdapter extends BaseAdapter 
{ 
    private Context context; 
    private ArrayList<TestList> testList; 
    private int selectedIndex; 
    private int selectedColor = Color.parseColor("#1b1b1b"); 

    public TestAdapter(Context ctx, ArrayList<TestList> testList) 
    { 
     this.context = ctx; 
     this.testList = testList; 
     selectedIndex = -1; 
    } 

    public void setSelectedIndex(int ind) 
    { 
     selectedIndex = ind; 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() 
    { 
     return testList.size(); 
    } 

    @Override 
    public Object getItem(int position) 
    { 
     return testList.get(position); 
    } 

    @Override 
    public long getItemId(int position) 
    { 
     return position; 
    } 

    private class ViewHolder 
    { 
     TextView tv; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View vi = convertView; 
     ViewHolder holder; 
     if(convertView == null) 
     { 
      vi = LayoutInflater.from(context).inflate(R.layout.test_list_item, null); 
      holder = new ViewHolder(); 

      holder.tv = (TextView) vi; 

      vi.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder) vi.getTag(); 
     } 

     if(selectedIndex!= -1 && position == selectedIndex) 
     { 
      holder.tv.setBackgroundColor(Color.BLACK); 
     } 
     else 
     { 
      holder.tv.setBackgroundColor(selectedColor); 
     } 
     holder.tv.setText("" + (position + 1) + " " + testList.get(position).getTestText()); 

     return vi; 
    } 

} 

अब सूची आइटम क्लिक होने पर चयनित इंडेक्स चर सेट करें।

public class TestActivity extends Activity implements OnItemClickListener 
{ 
    // Implemented onItemClickListener 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     adapter.setSelectedIndex(position); 
    } 
} 
+0

क्या आप कृपया अधिक विस्तार से समझा सकते हैं .. मुझे कुछ मिल रहा है लेकिन 100% नहीं। तो कृपया विस्तृत चरणों में समझाएं .. कृपया –

+0

पूर्ण कोड जोड़ा गया .. स्वयं को जांचें। – Shaiful

+1

धन्यवाद ... यह काम करता है .. –

2

मैं दो हफ्ते पहले इसके लिए देख रहा था और नतीजा यह है कि एक drawable चयनकर्ता के साथ संभव नहीं है। अधिक जानकारी के लिए एंड्रॉइड डेवलपर्स ब्लॉग में इस पोस्ट को पढ़ने के लिए: Touch Mode

फिर से शुरू करें: केवल जब आपकी उंगली स्क्रीन पर हों, तो आइटम का चयन किया जाता है।

अन्य संभावना को बचाने जो आइटम एक वर में चुना जाता है और अपने कस्टम एडाप्टर का उपयोग कर शैफुल कहते हैं की तरह अलग अलग रंग है।

+0

धन्यवाद जीन-फिलिप, मैं इसे देख लूंगा। –

2

lv.setSelector(R.drawable.highlighter);

drawable फ़ोल्डर में सूची दृश्य में चयनित आइटम को उजागर करने के
सबसे आसान तरीका है एक highlighter.png छवि डाल दिया।

5

शैफुल के महान समाधान पर विस्तार करने के लिए, आप अपने अपनी स्थिति में काम करने के लिए नहीं मिल सकता है।

प्रयोग कर रहे हैं, public void onListItemClick(ListView l, View v, int index, long id) में सभी अपने कोड है आप टुकड़े का उपयोग कर रहे हैं और अगर है एक अंतरफलक की घोषणा करने के बजाय OnListItemClickListener को लागू करने, या जो कुछ भी अपने आईडीई त्रुटियों उत्पन्न करने के लिए खड़ी कर रहा है, तो आप चर और तरीकों करना पड़ सकता है स्थिर।

public static int selectedPosition = 0; 
ArrayAdapter<Your_obj> adapter = null; 

@Override 
public void onListItemClick(ListView l, View v, int index, long id) { 
    super.onListItemClick(l, v, index, id); 

     selectedPosition = index; 
     Your_adapter.setSelectedIndex(selectedPosition); 
     adapter.notifyDataSetChanged(); 
} 

और Your_adapter में:

private static int selectedIndex; 

//public Your_adapter... 

public static void setSelectedIndex(int ind) { 
    selectedIndex = ind; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    WellHolder holder = null; 

    if (null == convertView) { 

       //set up your "holder" 
    } 

    if (position == selectedIndex) { 
     convertView.setBackgroundColor(convertView.getResources().getColor(R.color.cyan)); 
    } 
    else { 
     convertView.setBackgroundColor(convertView.getResources().getColor(R.color.silver)); 
    } 

    return convertView; 
} 

कुछ अन्य मतभेद हैं आप के रूप में "0" ऐसा कोई भी चर को प्रारंभ करने के लिए है कि नहीं है या "-1" और notifyDataSetChanged() अपनी गतिविधि में कहा जाता है ।

एक बार फिर, आपके समाधान @ सुफुल के लिए धन्यवाद। यह निश्चित रूप से मुझे एंड्रॉइड के लिए काम करने के लिए आईओएस में डिफ़ॉल्ट रूप से प्राप्त करने का प्रयास करने में समय बचाने में मदद करता है, जबकि चयनकर्ता/आइटम/केंद्रित/दबाए गए/आदि से परहेज करते समय।

+0

ऐसा इसलिए है क्योंकि आप राज्य सूची का उपयोग नहीं कर रहे हैं बल्कि यह एक अनावश्यक और उपयुक्त समाधान नहीं है, इस विषय के लिए इस तरह के स्टफ – Necronet

0

आप ListItem हाइलाइट तो आप कोड निम्न का उपयोग करना चाहिए प्रदर्शित करने के लिए एक drawable उपयोग कर सकते हैं: -

listView.setSelector(R.drawable.bg_image); 

यह काम करता है।

4

मुझे इसी तरह की समस्या का सामना करना पड़ा। यह मेरा समाधान है:

<ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="fill_parent" 
    android:listSelector="@drawable/listselector" /> 

listselector.xml के अंदर::

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_accelerated="false" 
     android:drawable="@drawable/bg" /> 
</selector> 

और अंत में अपने मुख्य आकर्षण के रंग के साथ एक drawable bg.xml

सबसे पहले अपने सूची दृश्य पर कस्टम सूची चयनकर्ता जोड़ें:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#33b5e6"/> 
</shape> 
+0

पर प्लेटफ़ॉर्म पर दुबला होना बेहतर है, धन्यवाद – LaurentY

2
//create a list_itemselectorin drawable folder 
//you will get the list item selected background color change once you select //the item 

    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 

     <!-- Focused State --> 
     <item android:state_focused="true"><shape> 
       <solid android:color="#66FFFFFF" /> 
      </shape></item> 
     <!-- Pressed State --> 

     <item android:state_pressed="true"><shape> 
       <solid android:color="@color/Black" /> 
      </shape></item> 

     <!-- Default State --> 
     <item><shape> 
       <solid android:color="@color/Black" /> 
      </shape></item> 

    </selector> 


    //create a list in layout folder 
     <ListView 
      android:id="@+id/mySlidingList" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:choiceMode="singleChoice" 
      android:divider="@color/GrayHot" 
      android:dividerHeight="1dip" 
      android:listSelector="@drawable/list_itemselector" 
      android:scrollbars="none" /> 

// और आउटपुट देखें।

0

सरल पूर्ण-एक्सएमएल समाधान है, जो मेरे लिए काम करता है। सबसे पहले, एक्सप्लोरर कोड के साथ एक्सएमएल-ड्रायबल को परिभाषित करें जिसमें "सामान्य" स्थिति किसी सूची आइटम के "चयनित अप्रत्याशित" दृश्य स्थिति से मेल खाती है, और राज्य दबाए गए = दृश्य को "दबाए गए" दृश्य के लिए सही है। फ़ाइल "custom_item_selector.xml" की उदाहरण के लिए, Holo नीले चयन जैसी:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
     <shape android:shape="rectangle"> 
      <solid 
       android:color="#643292ff"> 
      </solid> 
      <stroke 
       android:width="1dp" 
       android:color="#c83292ff"> 
      </stroke> 
     </shape> 
    </item> 
    <item> 
     <shape android:shape="rectangle"> 
      <solid 
       android:color="#323292ff"> 
      </solid> 
      <stroke 
       android:width="1dp" 
       android:color="#783292ff"> 
      </stroke> 
     </shape> 
    </item> 
</selector> 

(भी निर्धारित कर सकते हैं ध्यान केंद्रित राज्य वहाँ)। दूसरे, ListView के listSelector के रूप में इस एक्सएमएल-drawable लागू करते हैं और यह वांछित है choiceMode सेट:

<ListView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/listView" 
      android:choiceMode="singleChoice" 
      android:listSelector="@drawable/custom_item_selector"/> 

सब है कि। यह "बस चुने गए" और "दबाए गए" आइटमों के लिए अलग-अलग दृश्य राज्यों को परिभाषित करने की अनुमति देता है, उदाहरण के लिए प्रेस को आइटम पर चमकदार बनाना।

0

सूची आइटम (एकाधिक चयन) को हाइलाइट करने के लिए, जब क्लिक किया गया (सक्रिय), कृपया चरणों का पालन करें।

1. आइटम लेआउट को ड्रायबल के रूप में सूचीबद्ध करने के लिए पृष्ठभूमि सेट करें।

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:background="@drawable/list_item_selector"> 

     <ImageView 
      android:id="@+id/icon" 
      android:layout_width="22px" 
      android:layout_height="22px" 
      android:layout_marginLeft="4px" 
      android:layout_marginRight="10px" 
      android:layout_marginTop="4px" 
      android:src="@mipmap/ic_launcher" > 
     </ImageView> 

     <TextView 
      android:id="@+id/label" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@+id/label" 
      android:textSize="20px" > 
     </TextView> 
    </LinearLayout> 

2।drawable चयनकर्ता

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

<item android:state_pressed="true"  android:drawable="@android:color/holo_red_light" /> 

<item android:state_activated="true" android:drawable="@android:color/holo_orange_dark" /> 

</selector> 

3. सूची दृश्य सेट एकाधिक विकल्प मोड

getListView() setChoiceMode (ListView.CHOICE_MODE_MULTIPLE)।

जब दबाया: enter image description here

छवि से पता चलता है नीचे, उपयोगकर्ता एकाधिक सूची आइटम का चयन किया है।

जब सक्रिय: enter image description here

0

इस पोस्ट को संक्षेप में और हो सकता है कि भविष्य में किसी और की मदद मैं जवाब :)

पहले सुझाव है, हम निम्नलिखित सामग्री के साथ res/drawable/list_item_background.xml फ़ाइल बनाने की आवश्यकता करने के लिए:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_activated="true" 
     android:drawable="@color/list_item_activated" /> 
    <item 
     android:drawable="@color/list_item_default" /> 
</selector> 

अपने ड्रायबल संसाधनों को निश्चित रूप से निर्दिष्ट करें। और तुम भी state_pressed की तरह अलग अलग राज्यों के साथ अन्य <item> elemens जोड़ सकते हैं, state_focused आदि

फिर, हम हमारे कस्टम सूची आइटम ViewGroup तत्व (फाई res/layout/list_item_layout.xml) इस तरह के background पैरामीटर सेट करना चाहिए:

android:background="@drawable/list_item_background" 

अगला चरण हमारे कस्टम Adapter कक्षा को संशोधित कर रहा है। हम AdapterView.OnItemClickListener की onItemClick(...) विधि में setSelectedIndex(position) एडाप्टर की विधि बुलाना चाहिए

public class CustomAdapter extends BaseAdapter { 
    private List<Item> items; 
    private LayoutInflater itemInflater;   
    private int selectedIndex; // add this 

    public CustomAdapter(Context c, List<Item> items) { 
     this.items = items; 
     this.itemInflater = LayoutInflater.from(c); 
     selectedIndex = -1; // add this 
    } 

    /* add this */ 
    public void setSelectedIndex(int index) { 
     selectedIndex = index; 
     notifyDataSetChanged(); 
    } 

    /* other adapter's stuff */ 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null) { 
      convertView = itemInflater.inflate(R.layout.list_item_layout, parent, false); 
     } 

     // add this 
     convertView.setActivated(selectedIndex != -1 && position == selectedIndex); 

     /* do some stuff */ 

     return convertView; 
    } 
} 

अंत में, यहाँ निम्नलिखित कोड टुकड़ा है।

public class YourActivity extends Activity 
     implements AdapterView.OnItemClickListener { 

    private CustomAdapter mCustomAdapter; 

    /* activity implementation */ 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     mCustomAdapter.setSelectedIndex(position); 
    } 
} 

अब, हम पर प्रकाश डाला :)

पी.एस. उचित सूची आइटम के साथ संतुष्ट हो सकते हैं इस प्रकार

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

, हम उचित कई पर प्रकाश डाला आइटम मिल जाएगा: हम हमारी सूची पर बहु ​​विकल्प मोड सक्षम करना चाहते हैं हम सिर्फ हमारे गतिविधि वर्ग के लिए निम्नलिखित स्ट्रिंग भेजेंगे जहां listView उदाहरण रखा है।

- उम्मीद है कि यह किसी को भी :)

2

मुझे लगता है कि सबसे अच्छा और सबसे आसान समाधान यह है में मदद करता है। आप को सूची दृश्य पर स्वयं android:listSelector सेट करने या एडाप्टर में कोई भी परिवर्तन करने की आवश्यकता नहीं है। को OnItemClickListener में setSelection(position) पर कॉल करने की आवश्यकता है क्योंकि इसे स्वचालित रूप से संभाला जाता है।

  1. अपने ListView को सेट करें:

    android:choiceMode="singleChoice" 
    
  2. सेट सूची आइटम की पृष्ठभूमि से:

    android:background="?android:attr/activatedBackgroundIndicator" 
    
  3. यह है कि।

इस तरह आपको डिफ़ॉल्ट सिस्टम व्यवहार मिलेगा। इस प्रकार यह डिफ़ॉल्ट android.R.layout.simple_list_item_activated_1 लेआउट में किया जाता है।

+0

सरल विधि, धन्यवाद !!! – Prashanth

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

  • कोई संबंधित समस्या नहीं^_^