2012-04-03 3 views
2

Ich konnte kein Tutorial finden, das bei Mehrfachauswahl mit Cursors hilft. Im Moment funktioniert meine Logik wie ich will, aber die Checkboxen werden nicht richtig aktualisiert. Was übersehe ich?Wie kann ich Multi-Auswahl im Android-Dialogfeld aktualisieren

return new AlertDialog.Builder(this).setTitle("Items") 
      .setMultiChoiceItems(cur, CHECK, EDATE, new DialogInterface.OnMultiChoiceClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int position, boolean checked) 
       { 
        DBM.open(); 
        AlertDialog AD = (AlertDialog) dialog; 
        ListView list = AD.getListView(); 
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

        itemCur = (Cursor) list.getItemAtPosition(position); 

        if (checked) 
        { 
         //update query 
         DBM.setChecked(checkCur.getInt(checkCur.getColumnIndex(ID)), itemId, userId, 1); 
         list.setItemChecked(1, true); 
        } else 
        { 
         DBM.setChecked(checkCur.getInt(checkCur.getColumnIndex(ID)), itemId, userId, 0); 
         list.setItemChecked(1, false); 
        } 
        DBM.close(); 
       } 
      }).setPositiveButton("OK", new DialogButtonClickHandler()).create(); 

Antwort

0

So, nachdem ich fand schließlich eine Lösung, die ein bisschen und gehen durch ein paar verschiedene Iterationen in das Problem zu graben, dass ich mit ziemlich glücklich bin. Mit der Schule und der Arbeit, die hart drängte, hatte ich wenig Zeit draußen, um an zusätzlichen Projekten zu arbeiten, und ich habe mit dieser Lösung seit jetzt gesessen, aber nicht in der Lage, es bekannt zu geben.

Das letzte Stück zu meinem Puzzle war das Finden der ChangeCursor-Funktion, dies behob das Problem der alten Daten, die nicht mehr mit der DB zu laden. Meine aktuelle Hürde ist die Zeit, die es dauert, um eine Box zu überprüfen, es gibt eine offensichtliche Verzögerung von geklickt zu aktualisiert. Ich habe festgestellt, dass mehrere Datensätze aktualisiert werden, wenn auf einen geklickt wird. Ich habe keinen gültigen Grund für diese zusätzlichen Updates gefunden.

Unten ist der Code, den ich derzeit implementiert habe, um die Multi-Auswahl arbeiten zu lassen. Dies ist nur der Dialogcode, für eine funktionierende Demo werde ich ein Projekt auf GitHub für einen funktionierenden Prototyp von allem in Aktion veröffentlichen. (Jetzt veröffentlicht, Multiselect Dialog)

Ich bin ein ziemlich neuer Android-Entwickler, die Mehrheit meiner Android-Kenntnisse wurde selbst unterrichtet und durch das Wissen der Online-Ressourcen gelernt. Ich arbeitete an einem Schulprojekt und wollte eine Mehrfachauswahl in einem Dialog implementieren, der die Hauptaktivität mit den ausgewählten Optionen aktualisiert. Bitte geben Sie einen Rat, wie Sie dies verbessern können.

Pros:
- füllt Kontrollkästchen ordnungsgemäß bei Belastung.
- Aktualisiert die Datenbank, wenn auf die Prüfung geklickt wird.
- Hält die Anzeige nach der Änderung der Daten aktualisiert.

Nachteile:
- Klicken Sie auf das Kontrollkästchen, um den Wert zu aktualisieren.
- Änderungen im Dialogfeld können nicht rückgängig gemacht werden. Die Werte speichern onClick, ich konnte mir keine Möglichkeit vorstellen, die neuen Werte vorübergehend zu speichern, bis sie vom Benutzer bestätigt werden.
- Ein Klick aktualisiert mehrere Datensätze, manchmal auch, wenn Auswahl der Bildschirm-Werte aktualisieren scrollen

@Override 
protected Dialog onCreateDialog(int id) 
{ 
    switch (id) { 

    case 0: 
     LayoutInflater factory = LayoutInflater.from(this); 

     // Setup of the view for the dialog 
     final View bindListDialog = factory.inflate(R.layout.multi_list_layout, null); 
     multiListView = (ListView) bindListDialog.findViewById(R.id.multiList); 

     // Because I do not know how to properly handle an undo in this situation 
     // I make the dialog only close if the button is pressed and confirms the changes 
     return new AlertDialog.Builder(MultiSelectDemoActivity.this).setTitle(R.string.multiSelectTitle) 
       .setCancelable(false).setView(bindListDialog) 
       .setPositiveButton(R.string.btnClose, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) 
        { 
         updateItemList(); // In my implementation there is a list view 
              // that shows what has been selected. 
        } 
       }).create(); 
    default: 
     return null; 
    } 
} 

private static final boolean ONCREATE = true; 
private static final boolean ONUPDATE = false; 

private void setupMultiList(Boolean newList) 
{ 
    demoDBM.open(); 
    multiCur = demoDBM.getList(userId); // Gets all items tied to the user. 
    startManagingCursor(multiCur); 
    // Uses the cursor to populate a List item with an invisible ID column, 
    // a name column, and the checkbox 
    demoDBM.close(); 

    if (newList) 
    { 
     // Creates a new adapter to populate the list view on the dialog 
     multiAdapter = new SimpleCursorAdapter(this, R.layout.check_list_item, multiCur, new String[] { DemoDBM.ID, 
       DemoDBM.NAME, DemoDBM.SEL }, new int[] { R.id.itemId, R.id.itemName, R.id.itemCheck }); 
     multiAdapter.setViewBinder(new MyViewBinder()); 
     multiListView.setAdapter(multiAdapter); 
    } else 
    { 
     // updates the previously made adapter with the new cursor, without changing position 
     multiAdapter.changeCursor(multiCur); 
    } 
} 

@Override 
protected void onPrepareDialog(final int id, final Dialog dialog, Bundle args) 
{ 
    setupMultiList(ONCREATE); 
} 

public class MyViewBinder implements ViewBinder 
{ 
    @Override 
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) 
    { 
     int checkId = cursor.getColumnIndex(DemoDBM.SEL); 

     if (columnIndex == checkId) 
     { 
      CheckBox cb = (CheckBox) view; 
      // Sets checkbox to the value in the cursor 
      boolean bChecked = (cursor.getInt(checkId) != 0); 
      cb.setChecked(bChecked); // Switches the visual checkbox. 

      cb.setOnCheckedChangeListener(new MyOnCheckedChangeListener()); 
      return true; 
     } 
     return false; 
    } 
} 

public class MyOnCheckedChangeListener implements OnCheckedChangeListener 
{ 
    @Override 
    public void onCheckedChanged(CompoundButton checkBox, boolean newVal) 
    { 
     View item = (View) checkBox.getParent(); // Gets the plain_list_item(Parent) of the Check Box 

     // Gets the DB _id value of the row clicked and updates the Database appropriately. 
     int itemId = Integer.valueOf(((TextView) item.findViewById(R.id.itemId)).getText().toString()); 
     demoDBM.open(); 
     demoDBM.setChecked(itemId, userId, newVal); 
     demoDBM.close(); 

     setupMultiList(ONUPDATE); 
    } 
} 
0

Dialoge auf Android können nicht geändert werden. Wenn Sie sich den Quellcode ansehen, werden Sie feststellen, dass der Dialogbuilder alle Präsentationsaufgaben an einige Komponenten delegiert und Sie nach der Erstellung keinen Zugriff darauf haben. Wenn Sie also den Status der Komponenten ändern, die Sie zum Erstellen des Dialogfelds verwenden, werden die Dialogkomponenten anschließend nicht aktualisiert.

Sie können diesen Mechanismus sehen here und here: Sie haben keinen Zugriff auf den Access Controller nach OnCreate wurde auf dem Alert-Controller aufgerufen.

Am besten erstellen Sie eine neue Aktivität und geben ihr ein Dialogfeldthema.

+1

Ich war für einen einfacheren Weg der Hoffnung, als meinen eigenen Dialog zu machen. Warum wäre es möglich, mit den beiden String-Arrays den Dialog zu füllen und nicht den mit den Cursor-Informationen. Für mich ergibt das keinen Sinn. – ecoles

0

Sie können einfach die setCursor() Methode für AlertDialog verwenden. Es ist ziemlich einfach, so dass Sie wahrscheinlich kein Tutorial benötigen.

eine relevante SO Fragen ist here und die Dokumentation für sie sind here

Verwandte Themen