ListView onItemClick не работает в действии

Когда я использую это в действии, в котором есть ListView, это не сработало.

usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            ong arg3) {
    try {
        Intent intent = new Intent(UsersListActivity.this,
                UserActivity.class);
        startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

после поиска решения я сделал это в getView() адаптера

convertView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            ong arg3) {
    try {
        Intent intent = new Intent(mActivity,
                UserActivity.class);
        mActivity.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

Это работает. Но почему такое странное поведение. Почему он не работает так, как должен.

Благодарю вас


person Archie.bpgc    schedule 24.12.2012    source источник
comment
Вы используете пользовательский адаптер?   -  person Sahil Mahajan Mj    schedule 24.12.2012
comment
Ага. Я использую CustomAdapter почти для всех ListViews в моем проекте. Их около 10-12. Но я никогда не сталкивался с этой ошибкой. одна вещь, которая может вас заинтересовать: я использую один и тот же родитель и один и тот же list_item для 3 ListView, но с разными адаптерами, которые не должны вызывать никаких проблем, верно?   -  person Archie.bpgc    schedule 24.12.2012
comment
Я попытался дать некоторое объяснение этому неожиданному поведению в своем ответе ниже. Дайте мне знать, если я где-то ошибаюсь.   -  person Sahil Mahajan Mj    schedule 24.12.2012


Ответы (5)


usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

Здесь вы использовали View из Adapter View, который является родительским классом вашего Custom Adapter. вот почему это не работает. Вместо этого вы должны были использовать View из Custom Adapter.

Функция getView() здесь поможет вам преобразовать представление родителя Adpater View в представление Custom Adapter.

Таким образом, вы используете любой из двух вариантов,

usersList.setOnItemClickListener(new CustomAdapterView.OnItemClickListener() {

or

usersList.setOnItemClickListener(new OnItemClickListener() {

Оба варианта могут сработать.

person Sahil Mahajan Mj    schedule 24.12.2012
comment
Это похоже на это. Но почему это работало везде до сих пор? На самом деле из 3 похожих ListViews с одинаковым макетом и одинаковыми элементами ListView 1 работает нормально, а другие 2 - нет. - person Archie.bpgc; 24.12.2012
comment
Я не думаю, так и должно быть. В представлении списка, которое работало, могло быть что-то другое. Потому что, если вы используете пользовательский адаптер, вы должны использовать представление того же адаптера. - person Sahil Mahajan Mj; 24.12.2012
comment
Единственная разница в том, что 1, который работает, не имеет интерактивных дочерних элементов в ListViewItem. У двух других есть кнопка, onClickListener которой реализован в getView(). - person Archie.bpgc; 24.12.2012
comment
Вот и все. Вы получили объяснение. Если вам нужно использовать onClickListener, вам нужно использовать представление пользовательского адаптера. - person Sahil Mahajan Mj; 24.12.2012
comment
@Archie.bpgc: В любое время, на самом деле, благодаря тебе. Я не думал об этом раньше, но ваш пост позволил мне глубоко понять это. - person Sahil Mahajan Mj; 24.12.2012

Я нашел это в блоге:

Бывает так, что ваш пользовательский элемент списка не отвечает при нажатии… так в чем причина и каково решение?

Вот несколько проблем и решений:

1. Сценарий: макет элемента списка содержит CheckBox

Проблема: OnItemClickListener не отвечает.

Причина: CheckBox также имеет собственный прослушиватель кликов по умолчанию для изменения своего состояния, и он переопределяет контейнер ListView.

Решение: уберите фокус с CheckBox, установив для этих атрибутов значение false.

android:focusable="false"
android:focusableInTouchMode="false"

2. Сценарий: случайный

Проблема: OnItemClickListener вообще не отвечает!!!!

Причина: Без понятия..

Решение: в коде просто установите OnItemClickListener перед настройкой Adapter. Это работает случайным образом @@!

3. Сценарий: элемент списка содержит ImageButton

Проблема: OnItemClickListener вообще не отвечает!!!!

Причина: Без понятия!!!

Решение: в коде установите фокус ImageButton на false

ImageButton button = (ImageButton) convertView.findViewById(R.id.imageButton);
button.setFocusable(false);

4. Сценарий: элемент списка содержит TextView

Проблема: OnItemClickListener просто не отвечает.

Причина: я думаю, что вы установили этот атрибут в TextView: android:inputType=”textMultiLine”

Решение: просто удалите этот атрибут, используя вместо него android:minLines/android:maxLines.

5. Сценарий: элемент списка содержит TextView, который связан с URL-адресом веб-сайта или любыми вещами «mailto:».

Проблема: OnItemClickListener просто не отвечает.

Причина: TextView переопределяет фокус элемента списка.

Решение: просто удалите атрибут android:autoLink в TextView.

person Swapnil    schedule 20.10.2014

это сработает

lv.setOnItemClickListener(new OnItemClickListener() {

public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3) {
   // TODO Auto-generated method stub

     try {
       Intent intent = new Intent(mActivity, UserActivity.class);
       mActivity.startActivity(intent);
       } catch (Exception e) {
         e.printStackTrace();
      }
   }
});
person User    schedule 24.12.2012

Если у вас есть собственный AdapterView, вам нужно обратиться к этому AdapterView. Я думаю, что если вы сослались на представление адаптера суперклассов и когда вы вызываете setAdapter(), тогда ваш блок кода new AdapterView.OnItemClickListener() не будет выполняться.

usersList.setOnItemClickListener(new CustomAdapterView.OnItemClickListener() {

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            ong arg3) {
    try {
        Intent intent = new Intent(UsersListActivity.this,
                UserActivity.class);
        startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
person Lalith B    schedule 24.12.2012
comment
Но это то, что я использовал все время. Никогда не вызывал такой проблемы. - person Archie.bpgc; 24.12.2012

попробуйте использовать эту строку в классе Activity.

usersList.setOnItemClickListener(new OnItemClickListener() {

эта строка использует только адаптер в классе Activity, это не работает. я думаю не уверен

usersList.setOnItemClickListener(new AdapterView.OnItemClickListener() {    
person NagarjunaReddy    schedule 24.12.2012