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