Android: как отключить элементы списка при создании списка - PullRequest
19 голосов
/ 02 февраля 2010

Я довольно новичок в разработке Android и все еще работаю над многими вещами.

У меня есть главное меню с использованием следующего кода, но я не могу понять, как отключить выбранные элементы в меню. Кто-нибудь может мне помочь с примером кода?

public class listTest extends ListActivity {

    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setListAdapter(ArrayAdapter.createFromResource(this, R.array.mainMenu,
                android.R.layout.simple_list_item_1)); 
        //not sure how to disable list items here
    }

    protected void onListItemClick(ListView list, View view, int position, long id) {
        // can disable items when they are clicked on
        view.setEnabled(false);
    }   

}

и у меня есть string-array в моем файле strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="mainMenu">
        <item>Item 1</item>
        <item>Item 2</item>
        <item>Item 3</item>
    </string-array> 
</resources>

Спасибо

Ответы [ 4 ]

43 голосов
/ 31 марта 2010

Чтобы отключить элементы списка при создании списка, вы должны создать подкласс из ArrayAdapter. Вы должны переопределить следующие методы: isEnabled(int position) и areAllItemsEnabled(). В первом случае вы возвращаете true или false в зависимости от того, включен элемент списка в заданной позиции или нет. В последнем вы возвращаете false.

Если вы хотите использовать createFromResource(), вам также придется реализовать этот метод, поскольку ArrayAdapter.createFromResource() по-прежнему создает ArrayAdapter вместо вашего собственного адаптера.

Наконец, код будет выглядеть примерно так:

class MenuAdapter extends ArrayAdapter<CharSequence> {

    public MenuAdapter(
            Context context, int textViewResId, CharSequence[] strings) {
        super(context, textViewResId, strings);
    }

    public static MenuAdapter createFromResource(
            Context context, int textArrayResId, int textViewResId) {

        Resources      resources = context.getResources();
        CharSequence[] strings   = resources.getTextArray(textArrayResId);

        return new MenuAdapter(context, textViewResId, strings);
    }

    public boolean areAllItemsEnabled() {
        return false;
    }

    public boolean isEnabled(int position) {
        // return false if position == position you want to disable
    }
}
11 голосов
/ 02 февраля 2010

Я полагаю, включен ли элемент списка или нет, является частью состояния этого элемента, поэтому я полагаю, вы должны управлять этим в вашем ListAdapter. При создании подкласса адаптера вы можете переопределить isEnabled(position). Для любой позиции, которую вы вернете true, ListView пометит этот элемент как отключенный.

Итак, что вы хотите сделать, это примерно так:

class MenuAdapter extends ArrayAdapter<String> {

    public boolean isEnabled(int position) {
       // return false if position == positionYouWantToDisable
    }

}

Это, вероятно, требует, например, Map управление включенным состоянием каждого элемента, если вы хотите иметь возможность включать / отключать элемент с помощью установщика.

Затем установите пользовательский адаптер на свой ListView.

6 голосов
/ 31 января 2012

Вы можете отключить элемент списка (= сделать так, чтобы он не реагировал на прикосновения), вызвав оба

setClickable(false)

и

setFocusable(false)

в вашем адаптере, например.

По умолчанию это не отображается автоматически в графическом виде.

В настоящее время я использую его в списке, элементы списка которого не активируются, но большинство из которых содержат интерактивные виджеты. Хорошо работает.

Таким образом, элементы списка отображаются нормально, включая разделитель (см. Ответ Януша на принятый ответ выше).

0 голосов
/ 20 января 2014

Или просто отменить регистрацию и зарегистрировать OnItemClickListener может быть лучшей идеей.

Для регистрации:

lstDevice.setOnItemClickListener (контекст);

Для отмены регистрации:

lstDevice.setOnItemClickListener (нуль);

...