Как я могу обновить множественный выбор в диалоговом окне Android - PullRequest
2 голосов
/ 03 апреля 2012

Мне не удалось найти учебник, помогающий с несколькими вариантами выбора с помощью курсоров. На данный момент моя логика работает так, как я хочу, но флажки не будут обновляться должным образом. Что я пропускаю?

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

Ответы [ 3 ]

0 голосов
/ 04 июня 2012

Вы можете просто использовать метод setCursor() для AlertDialog. Это довольно просто, так что вам, вероятно, не понадобится учебник.

Соответствующие вопросы SO здесь и документы для него здесь

0 голосов
/ 30 августа 2012

Итак, немного покопавшись в проблеме и пройдя пару разных итераций, я наконец нашел решение, которым я вполне доволен.Из-за напряженной учебы и работы у меня было мало времени на работу над дополнительными проектами, и я пока что с этим решением сижу, но не могу опубликовать его.

Последней частью моей головоломки было нахождениеФункция changeCursor, исправила проблему старых данных, которые больше не соответствовали загружаемой БД.Мое текущее препятствие - это время, которое требуется, чтобы поставить флажок, есть очевидное отставание от клика до обновления.Я обнаружил, что записи Mutliple обновляются при нажатии.Мне не удалось найти действительную причину для этих дополнительных обновлений.

Ниже приведен код, который я в настоящее время реализовал, чтобы работать с несколькими вариантами выбора.Это просто код диалога, для рабочей демонстрации я буду публиковать проект на GitHub для рабочего прототипа всего этого в действии.(Обнародовано, Multiselect Dialog )

Я довольно новый разработчик Android, большинство моих знаний об Android самообучается и изучается благодаря знаниям онлайн-ресурсов.Я работал над школьным проектом и хотел реализовать множественный выбор в диалоге, который обновлял бы основной вид деятельности выбранными вариантами.Пожалуйста, предоставьте любые советы, как это можно улучшить.

Плюсы:
- правильно загружает флажки при загрузке.
- Обновляет базу данных при нажатии чека.
- Сохраняет отображение обновленным послеизменение данных.

Минусы:
- Необходимо установить флажок, чтобы обновить значение.
- Невозможно отменить изменения, сделанные в диалоговом окне.Сохранение значений onClick. Я не смог придумать способ временного сохранения новых значений до тех пор, пока они не будут подтверждены пользователем.
- Один клик обновляет несколько записей, также иногда, когда варианты прокручиваются после обновления экранных значений

@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 голосов
/ 03 апреля 2012

Диалоги на андроид не могут быть изменены.Если вы посмотрите на исходный код, то увидите, что диалоговое окно делегирует всю работу презентации некоторым компонентам, и у вас нет доступа к ним после создания.Таким образом, изменение состояния компонентов, которые вы используете для построения диалога, впоследствии не будет обновлять компоненты диалога.

Вы можете увидеть этот механизм здесь и здесь : выне иметь доступа к контроллеру доступа после вызова onCreate на контроллере оповещений.

Лучшее, если вы хотите добиться этого, - это перестроить новое действие и задать ему тему диалога.

...