ListView и кнопки внутри ListView - PullRequest
57 голосов
/ 15 июня 2010

Я хочу отобразить Button внутри ListView.Цель должна состоять в том, чтобы щелкнуть по строке ListView или по кнопке.

Нажмите на строку, где отображается дополнительная информация.Нажмите на кнопку, которая внизу показывает больше кнопок.

Так же, как приложение GMAIL.

Справа есть флажок, а после щелчка на флажке внизу кнопкапоявляется строка.

Моя проблема заключается в том, что после вставки кнопки в ListView кнопка не активируется.Если я добавлю к LinearLayout с кнопки llButton.setClickable(), это будет работать.Но только кнопка.ListView сам по себе больше не реагирует на нажатия!

Я пробовал этот пример .

Та же проблема, что и выше ...

Ответы [ 5 ]

120 голосов
/ 10 мая 2012

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

Принятый ответ является данным - вы всегда должны делать это при настройке прослушивателя щелчков для элементов списка, поэтому глупо, что OP этого не знал.

Если вы используете макет XML какваш элемент списка, просто установите для кнопки следующий атрибут, и это также приведет к тому, что элемент списка будет активным:

android:focusable="false"

18 голосов
/ 23 марта 2014

Добавьте строку ниже в ваш элемент списка XML.

android:descendantFocusability="blocksDescendants"

Тогда ваш элемент списка будет выглядеть так:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:descendantFocusability="blocksDescendants"
android:layout_height="wrap_content" >

    // Your layout objects here

</RelativeLayout>
8 голосов
/ 12 февраля 2011

Если вы используете пользовательский адаптер, нажатие кнопки внутри ListView не будет работать, поэтому вы должны попробовать использовать следующий код для проверки OnItemClickListener.

listId.setOnItemClickListener(new AdapterView.OnItemClickListener() {
   public void onItemClick(AdapterView<?> list, View v, int pos, long id) {
      // Your code for item clicks
   }
});
7 голосов
/ 26 сентября 2012

Чтобы событие вызывалось при нажатии кнопки или элемента списка, вы можете сделать следующее:

Вы обрабатываете только onItemClick:

mListView.setOnItemClickListener(new ListView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> a, View v, int i, long l) {
        // handle click here
    }
);

В адаптере вы изменяете кнопку, чтобы она не была кликабельной / фокусируемой (или вместо этого делайте это в файле XML):

public class MyAdapter extends BaseAdapter {
    ...
    public View getView(int position, View convertView, ViewGroup parent) {
        .....  
        Button btn = view.findViewById(R.id.button);
        btn.setFocusable(false);
        btn.setClickable(false);               
    }
}
0 голосов
/ 30 сентября 2014

В моем случае мне пришлось добавить этот атрибут в listView:

<ListView
...
android:clickable="true"
...
</ListView>

А в адаптере просто добавить прослушиватель щелчков в представлении кнопки.чтобы установить окончательные переменные:

public View getRowView(final int position, View convertView, ViewGroup parent) {
    final BrowseContactItemWrapper wrapper;
    final UserModel mContact = lstContact.get(position);
    .....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...