ListView и кнопки внутри ListView

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

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

То же самое, что и приложение GMAIL.

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

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

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

Тот же вопрос, что и выше …

Solutions Collecting From Web of "ListView и кнопки внутри ListView"

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

 listId.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> list, View v, int pos, long id) { // Your code for item clicks } }); 

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

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

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

android:focusable="false"

Добавьте строку ниже в свой 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> 

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

Вы обрабатываете только 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); } } 

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

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

А в адаптере просто добавьте кнопку прослушивания кликов в виде кнопки.

 wrapper.getButtonHi().setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub DebugUtils.logDebug("Clickeado :: "+ mContact.getUserId()); } }); 

Важно установить окончательные переменные:

 public View getRowView(final int position, View convertView, ViewGroup parent) { final BrowseContactItemWrapper wrapper; final UserModel mContact = lstContact.get(position); ..... }