Android: onPrepareDialogBuilder, onClick и setItemChecked - PullRequest
0 голосов
/ 08 октября 2010

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

Вот самый простой код, который я могу придумать, который должен работать. Он не снимает флажок даже при установке его на ложь, я тоже пробовал истину. Почему это не работает? Если это не сработает, что будет?

Любая помощь будет наиболее ценной.

    @Override
    protected void onPrepareDialogBuilder(Builder builder) 
    {
     CharSequence[] entries = getEntries();
     CharSequence[] entryValues = getEntryValues();

        if (entries == null || entryValues == null || entries.length != entryValues.length ) {
            throw new IllegalStateException(
                    "ListPreference requires an entries array and an entryValues array which are both the same length");
        }

        // Added by WJT since we are loading the entries values after instantiation 
        // we need the clicked indexes to be setup now, they would not have been
        // set up in the constructor
        if ((mClickedDialogEntryIndices == null) || (mClickedDialogEntryIndices.length == 0))
         mClickedDialogEntryIndices = new boolean[getEntries().length];

        restoreCheckedEntries();
        builder.setMultiChoiceItems(entries, mClickedDialogEntryIndices, 
                new DialogInterface.OnMultiChoiceClickListener() 
        {
   public void onClick(DialogInterface dialog, int which, boolean val) 
   {
    mDlg = (AlertDialog)getDialog();
                mListView = (ListView)mDlg.getListView();
    if (val)
             {
              if (mSelectedCount < mLimit)
                 {
               mClickedDialogEntryIndices[which] = val;
                  mSelectedCount++;

                 }
              else
                 {
                  mListView.setItemChecked(which, false);
               Toast.makeText(getContext(),
              R.string.newsLimitExceededMessage,
              Toast.LENGTH_LONG).show();

                 }  // (mSelectedCount < mLimit)

             }
             else
             {
              mClickedDialogEntryIndices[which] = val;
              mSelectedCount--;

             }  // (val)

   }  // void onClick(DialogInterface dialog, int which, boolean val)


        });  //  DialogInterface.OnMultiChoiceClickListener() 

    }  // void onPrepareDialogBuilder(Builder builder) 

Спасибо

\ ^ / i l l

1 Ответ

0 голосов
/ 09 октября 2010

Вот как я мог бы подойти к этой проблеме:

Шаг # 1: Получите эту работу в автономном тестовом задании.Забудьте о предпочтениях.Забудьте диалоги.Просто сосредоточьтесь на функциональности наличия CHOICE_MODE_MULTIPLE ListView, где после проверки определенного количества элементов непроверенные элементы становятся отключенными.

Шаг # 2: Получите функциональность из шага № 1, работая вформа пользовательского виджета.Под этим я подразумеваю, что вы реализуете подкласс ListView (я полагаю ... это может быть некоторый контейнер, если есть нечто большее, чем ListView), который запекает все, что вам нужно из шага № 1.

Шаг # 3: Создайте пользовательский подкласс DialogPreference, который использует пользовательский виджет из шага # 2.

Например, - это пример проекта , где у меня есть пользовательскийColorMixer виджет, свернутый в ColorPreference.

...