2011-09-14 15 views
13

Resimle bir liste görüşüm var. Her öğeyi tıklattığımda görüntü tıklanan görüntü olarak değişir. Ancak başka bir öğeyi seçtiğimde her iki görüntü de değişir. Yalnızca seçilen öğeyi değiştirmek istiyorum image.it tek seçenek mode.pls yardımı ile radyo düğmesi gibi çalışmak zorunda.görüntüler ile liste görünümü için tek seçenek modunun nasıl ayarlanacağı

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

Gelecekte referans için bunu kontrol edin ** https: //www.youtube.com/watch? V = s4JwU28VMko ** –

cevap

37

burada önerilen çözüm temel almaktır yerleşik bunun için tek seçenek modunu belirten ListView seçim desteği:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Sonra liste öğesi Checkable arabirimini uygulamak için uygulamaya izin vermeli; Bu, düzeninizin kök görünümünün biraz özelleştirilmesini gerektirir.

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); 
    } 
} 

düzeniniz dosya tabii ki çok yerine LinearLayout ait MyListItem sınıfını başvurmak için güncellenmelidir: gibi bir kök olarak LinearLayout sahip olduğunu varsayarsak, bir uygulama görünebilir.

Bu biraz zor bir yaklaşım olabilir, ancak etkinlik yeniden oluşturulduğunda kontrol edilen öğeyi otomatik olarak geri yükleme gibi avantajlara sahiptir. öğe kontrol edilir ve buna göre güncelleme görüntü eğer

Başka bir seçenek bilmek yine listenin seçim modunu kullanmak ve adaptörünün GetView geçersiz kılmak için geçerli:

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; 
     } 
    }); 
} 

Ancak bu sürüm bazı performans sorunları vardır - findViewById ve setImageResource nispeten vardır Zaman harcayan işlemler, bu yüzden bazı önbellek kullanmayı düşünmelisiniz. Bu widget ile ilgili bazı yararlı ipuçları öğrenmek için "The world of ListView" video'u izlemenizi tavsiye ederim. İkinci yaklaşım, aynı zamanda, adaptörün gereksiz kuplajı sağlayan liste görünümüne de bağlamaktadır.

+2

Bu, çok yaygın bir sorun gibi göründüğü için daha fazla ayrıntıyla daha iyi bir yanıt olurdu. –

+0

+1 Bir çekicilik gibi çalışır. Paylaştığın için teşekkürler. – Dharmendra

+0

Güzel cevap. Çok zarif bir çözüm. Teşekkürler! – dum4ll3

4
  1. Liste görünümünüzde doğru seçim modunu ayarlayın. İhtiyacınıza göre setChoiceMode.
  2. İstediğiniz resmi kullanmak için duruma göre çekilebilir bir seçici oluşturun.
  3. Seçicinizi arka plan olarak ayarlayın. Bilginize

    android:background="@drawable/your_selector" 
    

    :

+1

Bu çok zarif bir çözümdür.Benim için anahtar, 'android: list_selector =' @ drawable/your_selector ''' ListView' yerine' 'LinearLayout 'maddesinde' android: background =' @ drawable/your_selector ''ı kullanmam gerektiğinin farkına vardı. –

İlgili konular