Как отменить активацию / выделение элемента ListView для Android в setOnItemClickListener в ListView? - PullRequest
4 голосов
/ 14 марта 2012

В одном из моих занятий у меня есть несколько ListView элементов управления. Скажите Список 1 , Список 2 & Список 3 . На Список 1 щелчок элемента, я загружаю данные для Список 2 & Список 3 из веб-службы. И фон выделенного элемента подсвечивается. Я добился этого с помощью следующего селектора.

<item android:drawable="@drawable/item_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/item_focused" android:state_focused="false" 
    android:state_pressed="false" 
    android:state_selected="true"/>
<item android:state_activated="true" android:drawable="@drawable/item_selected"/>

Как вы можете видеть, я указал android: state_activation = "true" , чтобы изменить BG для элемента, на который щелкнули / нажали. Это хорошо работает.

На самом деле я хочу, чтобы выбранный элемент не был выбран / выделен, если загружаются данные для какого-либо другого элемента ... как

list1.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                // load data if no other call to web service is in progress
                if (_isNotLoadingData) {
                     loadList2AndList3DataUsingWebService();
                } else {
                    //Stop This Item From selected/highlighted
                    //BUT none of the following work. .. Item is always Selected
                    view.setSelected(false);
                    //view.setActivated(false);
                    //view.setEnabled(false);
                }
            }
        });

Приведенный выше код не позволяет нескольким вызовам перенаправляться на наш веб-сервис, но я не могу остановить выделение / активацию элемента, если веб-сервис не вызывается для этого элемента ListView.

Как мне этого достичь?

РЕДАКТИРОВАТЬ в 8:08 вечера 19 марта 2012 г .: Нет правильного ответа ... я застрял и жду любую помощь

Ответы [ 6 ]

11 голосов
/ 21 марта 2012

Я действительно столкнулся с той же проблемой несколько дней назад.Решением является , а не для установки view.setItemChecked (false), а вместо этого в .onItemClick() -методе, вызовите ваш listview и установите listview.setItemChecked(position, false).Это решило это для меня.

Пример:

listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view,
            int position, long arg3) {

        // load data if no other call to web service is in progress
        if (_isNotLoadingData) {
             loadList2AndList3DataUsingWebService();

        } else {
            ListView lv = (ListView) adapterView;
            lv.setItemChecked(position, false);
        }
    }
});
1 голос
/ 22 марта 2012

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

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

public class MyCoolAdapter extends ListAdapter {

private boolean mIsLocked;

public boolean areAllItemsEnabled () {
    return false;
}

public abstract boolean isEnabled (int position) {
    if (mIsLocked) {
       return false;
    }
    return true;
}
...
}

Если выЕсли вы хотите отключить только определенные строки, вы возвращаете false для этих позиций и true для других.

При изменении параметра isLoading вам придется уведомить об изменении набора данных.Это заставит просмотр списка запрашивать адаптер.Например:

public void setIsLoading(final boolean isLocked) {
   mIsLocked = isLocked;
   notifyDatasetChanged();
}
0 голосов
/ 23 марта 2012

Попробуйте установить селектор списка в ноль, используя setSelector .

0 голосов
/ 14 марта 2012
listView.setOnItemClickListener(new OnItemClickListener()
    {

        @Override
        public void onItemClick(AdapterView<?> adapterView, View view,
                int position, long arg3)
        {

            //view.setEnabled(false);
            //adapterView.setEnabled(false);
        }
    });
  1. view.setEnabled (ложь); Используйте это, если вы хотите отключить listItem, по которому щелкнул пользователь. Это предотвращает событие onclick для этого конкретного элемента.

  2. adapterView.setEnabled (ложь); Используйте это, если вы хотите отключить весь listView. Это предотвратит событие onclick для всего listView.

Надеюсь, эта помощь

0 голосов
/ 14 марта 2012

, если вы не хотите обрабатывать событие клика после первого клика, просто используйте yourList.setOnItemClickListener(null)

0 голосов
/ 14 марта 2012

в слушателе onclick вы можете вызвать setonclicklistener (null) в представлении, которое вызывает событие click. В этом случае представление удалит свой собственный onclicklistener.

mTitleView.setOnClickListener(null)
...