2011-09-14 13 views
13

Mam podgląd listy z obrazem. Kiedy zaznaczam każdy element, obraz zmienia się w kliknięty obraz.Ale gdy wybiorę inny element, oba obrazy się zmieniają. Chcę, aby zmienił się tylko wybrany element obraz.it musi funkcjonować jak przycisk radiowy z pomocą jednego trybu wyboru trybu.sposób ustawiania trybu pojedynczego dla widoku listy ze zdjęciami

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

Sprawdź to na przyszłość ** https: //www.youtube.com/watch? V = s4JwU28VMko ** –

Odpowiedz

37

Zalecanym rozwiązaniem jest tu polegać na wbudowaną obsługę selekcji ListView za określającego tryb single-wybór dla IT:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Następnie należy pozwolić element listy, aby wdrożyć do realizacji Checkable interfejs; to wymaga pewnego dostosowania widoku głównego twojego układu. Zakładając, że ma LinearLayout jako root, implementacja może wyglądać następująco:

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

Plik układ powinien być aktualizowany odwołać MyListItem klasę zamiast LinearLayout też, oczywiście.

To może być dość trudne podejście, ale ma zalety, takie jak przywracanie sprawdzanego elementu automatycznie po odtworzeniu działania.

Inną opcją jest ponownie użyć trybu wyboru listy i zastąpić adaptera getView wiedzieć, czy element jest sprawdzana i zmiana obrazu odpowiednio:

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

Jednak ta wersja ma pewne problemy z wydajnością - findViewById i setImageResource są stosunkowo czasochłonne operacje, więc powinieneś rozważyć użycie pamięci podręcznej. Polecam, aby obejrzeć "The world of ListView" video, aby poznać kilka bardzo przydatnych wskazówek na temat tego widgetu.

To ostatnie podejście wiąże również adapter z listview, który wprowadza niepotrzebne sprzężenie.

+2

To byłaby lepsza odpowiedź z większą ilością szczegółów, ponieważ wydaje się, że jest to bardzo powszechny problem. –

+0

+1 Działa jak urok. Dziękuję za udostępnienie. – Dharmendra

+0

Dobra odpowiedź. Bardzo eleganckie rozwiązanie. Dzięki! – dum4ll3

4
  1. Ustaw prawidłowy tryb wyboru w widoku listy. setChoiceMode zgodnie z potrzebami.
  2. Utwórz selektor do rysowania, aby użyć obrazu, który chcesz, zgodnie ze stanem.
  3. Ustaw selektor jako tło.

    android:background="@drawable/your_selector" 
    

    FYI:

+1

To jest takie eleganckie rozwiązanie.Kluczem było dla mnie uświadomienie sobie, że muszę użyć 'android: background =" @ drawable/your_selector "' na elemencie 'LinearLayout' zamiast używać' android: list_selector = "@ drawable/your_selector" 'w' ListView'. –

Powiązane problemy