2012-12-19 5 views
8

ich einen einfachen Android App entwickle, die mit einer Checkbox ein Listview erstellt alsisChecked() Verhalten genau gegenüber in 2.3.6 und 4.2 Android Versionen

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 
      } */ 

folgen Dies ist wirklich seltsam. Wie wird die App jemals mit beiden Versionen kompatibel sein, wenn sie völlig entgegengesetzte Prüfungen erfordern?

Bitte lassen Sie mich wissen, wie ich damit umgehen kann. Jede Hilfe wird geschätzt.

+0

Das ist komisch. Hast du versucht, auf 2.3.3/2.3.6 AVD zu laufen? –

Antwort

3

Ich kenne das Problem, auf neueren Frameworks die onItemClick Aufruf vor dem Checkd-Attribut des Kontrollkästchens geändert!

Ich überprüfe den aktivierten Zustand meiner Checkboxen, nachdem ein Objekt geklickt hat (z. B. beim Schließen der Aktivität oder beim Klicken auf die Schaltfläche "Speichern").

betrachten list.getCheckedItemPositions() ... es wird eine SparseBooleanArray zurückgeben, die Sie verwenden können!

EDIT: Beispiel

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 Ich plane das zu tun. Ein kleinerer Unterschied ist jedoch, dass die Platzierung der Cancel & Ok-Tasten vertauscht ist. Dies ist jedoch harmlos. –

+0

Thanks.Yes Ich verwende das SparseBooleanArray, um die Überprüfungen zu verarbeiten. Wie ich bereits erwähnt habe, muss ich die Schecks vor der Verarbeitung auf dem AVD & meinem Handy umkehren, damit es funktioniert. –

+0

können Sie bitte näher darauf eingehen. Ich habe auf AVD 2.3.3 überprüft das Verhalten ist immer noch das Gegenteil mit dem echten Gerät. –

2

Das Problem kann durch Überprüfen der Version des Geräts gelöst werden.

Die Dokumentation empfiehlt, dass Sie Build.VERSION.SDK_INT mit den Werten in Build.VERSION_CODES überprüfen.

Verwendungsbeispiel

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

(Mehr wie ein Hack als eine Lösung, obwohl)

+0

danke für den Vorschlag. Gibt es eine Möglichkeit, herauszufinden, bei welcher Version sich dieses Verhalten geändert hat, so dass ich einen Scheck hinzufügen kann? Die Überprüfung würde die umgekehrte Bedingung für größere Versionen verwenden (z. B.> 4.x). –

+0

Auch dies ist wahrscheinlich ein Hack, aber Sie könnten nur das Verhalten bei größeren Betriebssystemrevisionen testen. Überprüfen Sie auf 2.3. Wenn nicht, dass es wahrscheinlich in 4,0 – cjds

+0

geändert wurde baute ich auf 2.3.3. Das Verhalten in AVD (2.3.3) und Gerät (2.3.6) ist immer noch das Gegenteil. Es macht mich verrückt. Ich bin mir nicht sicher, was ich tun soll. –

0

Sie können auch versuchen, etwas zu verwenden:

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

Wie ein Ergebnis haben Sie eine Flagge geprüft, die angibt, wie der Status des Elements nach dem Klick aussieht.

Verwandte Themen