2011-09-14 13 views
13

मेरे पास छवि के साथ एक सूचीदृश्य है। जब मैं प्रत्येक आइटम का चयन करता हूं तो छवि क्लिक की गई छवि में बदल जाती है। लेकिन जब मैं एक और आइटम चुनता हूं तो दोनों छवियां बदलती हैं। मैं केवल चयनित आइटम को बदलना चाहता हूं image.it को सिंगल पसंद मोड के साथ रेडियो बटन की तरह काम करना होगा। कृपया मदद करें।छवियों के साथ सूचीदृश्य के लिए विकल्प मोड एकल सेट करने के लिए कैसे करें

public class ProvierActivity extends Activity { 
    private String text[] = { "BroadStripe-Cable (Seattle)", "BroadStripe-Digital (Seattle)", 
     "BroadStripe-Cable (Seattle)", "Comcast king county south)", "BroadStripe-Cable (Seattle)", 
     "Comcast king county south", "BroadStripe-Digital (Seattle)", "BroadStripe-Digital (Seattle)", 
     "BroadStripe-Cable (Seattle)", "Comcast king county south" }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final ListView list = (ListView) findViewById(R.id.listview_id); 

     list.setAdapter(new ArrayAdapter<String>(this, R.layout.list, 
      R.id.title, text)); 

     list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
      public void onItemClick(AdapterView<?> arg0, View view, 
       int position, long arg3) { 
       // TODO Auto-generated method stub 

       if (view.findViewById(R.id.img).getVisibility() == ImageView.VISIBLE) { 
        ImageView icon = (ImageView) view.findViewById(R.id.img); 

        icon.setImageResource(R.drawable.checked); 
       } 
      } 
     }); 
    } 
} 
+0

भविष्य के संदर्भ के लिए इसे जांचें ** https: //www.youtube.com/watch? V = s4JwU28VMko ** –

उत्तर

37

यहाँ सिफारिश समाधान पर भरोसा करने के लिए है में निर्मित ListView के चयन समर्थन इसके लिए एक-विकल्प मोड को निर्दिष्ट:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

तो फिर आप अपने सूची आइटम Checkable इंटरफ़ेस को लागू करने को लागू करने देना चाहिए; इसके लिए आपके लेआउट के रूट व्यू के कुछ अनुकूलन की आवश्यकता है। यह मानते हुए कि यह एक रूट के रूप में LinearLayout है, एक कार्यान्वयन लग सकता है जैसे:

public class MyListItem extends LinearLayout implements Checkable { 

    public MyListItem(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyListItem(Context context) { 
     super(context); 
    } 

    private boolean checked = false; 

    private ImageView icon; 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     icon = (ImageView)findViewById(R.id.img); // optimisation - you don't need to search for image view every time you want to reference it 
    } 
    @Override 
    public boolean isChecked() { 
     return checked; 
    } 

    @Override 
    public void setChecked(boolean checked) { 
     this.checked = checked; 
     if (icon.getVisibility() == View.VISIBLE) { 
      icon.setImageResource((checked) ? R.drawable.checked : R.drawable.unchecked); 
     } 
    } 

    @Override 
    public void toggle() { 
     setChecked(!checked); 
    } 
} 

आपका लेआउट फ़ाइल LinearLayout के बजाय MyListItem वर्ग संदर्भ के लिए भी निश्चित रूप से, अद्यतन किया जाना चाहिए।

यह कुछ मुश्किल दृष्टिकोण हो सकता है, लेकिन इसके लाभ होने पर स्वचालित रूप से चेक किए गए आइटम को पुनर्स्थापित करने जैसे लाभ हैं।

एक अन्य विकल्प यदि आइटम चेक किया गया है और अद्यतन छवि तदनुसार सूची की पसंद मोड फिर से उपयोग करें और पता करने के लिए एडाप्टर के getView ओवरराइड करने के लिए है:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final ListView list = getListView(); 
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    list.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, 
      R.id.title, text) { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = super.getView(position, convertView, parent); 
      ImageView icon = (ImageView) v.findViewById(R.id.img); 
      if (list.isItemChecked(position)) { 
       icon.setImageResource(R.drawable.checked); 
      } else { 
       icon.setImageResource(R.drawable.unchecked); 
      } 
      return v; 
     } 
    }); 
} 

हालांकि इस संस्करण कुछ प्रदर्शन के मुद्दों है - findViewById और setImageResource अपेक्षाकृत हैं समय लेने वाले संचालन ताकि आपको कुछ कैशिंग का उपयोग करने पर विचार करना चाहिए। मैं इस विजेट के बारे में कुछ बहुत उपयोगी टिप्स जानने के लिए "The world of ListView" video देखने की सलाह देता हूं।

उत्तरार्द्ध दृष्टिकोण भी सूचीदृश्य में एडाप्टर से संबंध रखता है जो अनावश्यक युग्मन प्रस्तुत करता है।

+2

यह अधिक जानकारी के साथ एक बेहतर उत्तर होगा क्योंकि यह एक बहुत ही आम समस्या प्रतीत होता है। –

+0

+1 एक आकर्षण की तरह काम करता है। इसे साझा करने के लिए धन्यवाद। – Dharmendra

+0

अच्छा जवाब। बहुत सुरुचिपूर्ण समाधान। धन्यवाद! – dum4ll3

4
  1. अपनी सूची दृश्य में सही विकल्प मोड सेट करें। setChoiceMode आपको जो चाहिए उसकी आवश्यकता के अनुसार।
  2. राज्य के अनुसार इच्छित छवि का उपयोग करने के लिए एक खींचने योग्य चयनकर्ता बनाएं।
  3. अपने चयनकर्ता को पृष्ठभूमि के रूप में सेट करें।

    android:background="@drawable/your_selector" 
    
    FYI करें

    :

+1

यह एक सुरुचिपूर्ण समाधान है।मेरे लिए कुंजी यह महसूस कर रही थी कि ''roid: list_selector =" @ drawable/your_selector "' 'ListView' 'का उपयोग करने के बजाय मुझे' android: background = "@ drawable/your_selector" आइटम' LinearLayout' 'पर उपयोग करने की आवश्यकता है। –

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