Подтвердить что ты не робот

Android: как отключить элементы списка при создании списка

Я новичок в Android dev и все еще разрабатываю много вещей.

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

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>

Спасибо

4b9b3361

Ответ 1

Чтобы отключить элементы списка при создании списка, вы должны подклассом от 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
    }
}

Ответ 2

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

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

class MenuAdapter extends ArrayAdapter<String> {

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

}

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

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

Ответ 3

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

setClickable(false)

и

setFocusable(false)

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

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

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

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

Ответ 4

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

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

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

Отменить регистрацию:

lstDevice.setOnItemClickListener(нуль);