2012-12-19 13 views
8

Zajmuję prostą aplikację dla systemu Android, która tworzy ListView z wyboru następującoIsChecked() zachowanie dokładnie naprzeciwko w wersjach 2.3.6 i 4.2 android

listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,results); 
this.setListAdapter(listAdapter); 
ListView lv = getListView(); 
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

lv.setOnItemClickListener(new OnItemClickListener(){ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
         long id) { 
      CheckedTextView check = (CheckedTextView)view; 
      //The below code needed for running on AVD version 4.2 
      if(check.isChecked()) { 
        // Checkbox checked do something 
      } 
      else { 
        // Not checked. Do something 
      } 
      /* Exact opposite need on Samsung phone running 2.3.6 
      if(!check.isChecked()) { 
         // Checkbox checked do something 
      } 
      else { 
      // Not checked. DO something 
      } */ 

To jest naprawdę dziwne. W jaki sposób aplikacja będzie kiedykolwiek kompatybilna z obie wersje, gdy wymagają one całkowicie przeciwnych kontroli?

Proszę dać mi znać, jak sobie z tym poradzę. Każda pomoc zostanie doceniona.

+0

To dziwne. Czy próbowałeś używać 2.3.3/2.3.6 AVD? –

Odpowiedz

3

Znam problem, na nowszych frameworkach wywołanie onItemClick zanim zmieniono checkd atrybutu checkbox!

Sprawdzam zaznaczony stan moich okien wyboru po kliknięciu elementu (np. Przy zamykaniu działania lub kliknięciu przycisku Zapisz).

spójrz na list.getCheckedItemPositions() ... to zwróci SparseBooleanArray, którego możesz użyć!

EDIT: Przykład

public class MyMultiChoiceActivity extends Activity implements View.OnClickListener { 

    private ListView list = null; 
    private boolean savedSelectionInvalid = true; 
    private List<Integer> selectedIds = new ArrayList<Integer>(); 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     this.setContentView(R.layout.entry_data_multi_choice_filter); 

     //initialize the list 
     list = (ListView) findViewById(R.id.list); 
     listAdapter = new MyListAdapterClass(this, R.layout.list_item_multiple_choice); 
     list.setAdapter(listAdapter); 

     //onclick on a item, set the selectaion as invalid 
     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       savedSelectionInvalid = true; 
      } 
     }); 

     list.setAdapter(listAdapter); 

     //... 
    } 

    //... 

    private void validateChecked() { 
     if(savedSelectionInvalid == true) { 
      SparseBooleanArray checkedItemlist = list.getCheckedItemPositions(); 
      selectedIds.clear(); 
      for (int i=0; i < checkedItemlist.size(); i++){ 

       if (checkedItemlist.valueAt(i)) { 
        selectedIds.add(a.keyAt(i)); 
       } 
      } 
      this.savedSelectionInvalid = false; 
     } 
    } 

    //... 

    //this method se 
    private void saveAndClose() { 
     validateChecked(); 

     //now you have the selectedIds filled with every checked item key! 

     this.finish(); 
    } 
} 
+0

@Karthik Planuję to zrobić. Mniejsza różnica polega jednak na tym, że umieszczanie przycisków Anuluj i Ok jest zamieniane. To jednak nieszkodliwe. –

+0

Dzięki. Tak, używam SparseBooleanArray do przetwarzania czeków. Jednak, jak już wspomniałem, muszę odwrócić kontrole przed przetworzeniem na AVD i mój telefon, aby działał. –

+0

proszę o szczegóły. Sprawdziłem na AVD 2.3.3 zachowanie jest nadal przeciwieństwem prawdziwego urządzenia. –

2

Problem można rozwiązać przez sprawdzenie wersji urządzenia.

Dokumentacja zaleca sprawdzenie Build.VERSION.SDK_INT w odniesieniu do wartości w Build.VERSION_CODES.

wykorzystanie próbki

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) { 
// only for android older than gingerbread 
} 

http://developer.android.com/reference/android/os/Build.VERSION.html

(więcej jak hack niż rozwiązanie chociaż)

+0

dzięki za sugestię. Czy istnieje sposób, aby dowiedzieć się, w której wersji to zachowanie się zmieniło, aby móc dodać czek? Sprawdzanie użyłoby warunku odwrotnego dla większych wersji (np.> 4.x) –

+0

Znów jest to prawdopodobnie hack, ale można po prostu przetestować zachowanie na głównych wersjach systemu operacyjnego. Sprawdź 2.3. Jeśli nie to, że prawdopodobnie zmieniło się w wersji 4.0 – cjds

+0

, zbudowałem 2.3.3. Zachowanie w AVD (2.3.3) i urządzeniu (2.3.6) jest nadal przeciwne. To doprowadza mnie do szału. Nie jestem pewien, co robić. –

0

Można także spróbować użyć czegoś takiego:

mFilterListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     ... 
     SparseBooleanArray checkedItemlist = mFilterListView.getCheckedItemPositions(); 

     boolean checked = false; 
     for (int i = 0; i < checkedItemlist.size(); i++) { 
      if (checkedItemlist.keyAt(i) == position) { 
      checked = checkedItemlist.valueAt(i); 
     } 
     ... 
    } 
} 

jako wynik masz flagę sprawdzone, która wskazuje, jaki jest stan elementu po kliknięciu.

Powiązane problemy