Как запустить onListItemClick в Listactivity с помощью кнопок в списке?

У меня есть простая ListActivity, которая использует собственный ListAdapter для создания представлений в списке. Обычно ListAdapter просто заполняет представления TextViews, но теперь я хочу также добавить туда кнопку.

Однако я понимаю и опыт, что включение в элемент списка фокусного представления предотвращает запуск onListItemClick () в ListActivity при щелчке элемента списка. Кнопка все еще функционирует нормально в элементе списка, но когда что-то, кроме кнопки, нажата, я хочу запустить onListItemClick.

Как я могу сделать эту работу?

как я писал в предыдущем комментарии, решение – setFocusable (false) в ImageButton.

Еще более элегантное решение пытается добавить android:descendantFocusability="blocksDescendants" в корневой компоновке элемента списка. Это сделает клики onListItem возможными, и отдельно вы можете обрабатывать нажатия кнопок Button или ImageButton

Надеюсь, поможет 😉

ура

Надеюсь, я могу помочь здесь. Я предполагаю, что у вас есть настраиваемый макет для элементов listView, и этот макет состоит из кнопки и некоторых других представлений – например TextView, ImageView или любого другого. Теперь вы хотите, чтобы разные события запускались при нажатии кнопки, а другое событие срабатывало по всем остальным щелчкам.

Вы можете достичь этого, не используя onListItemClick () вашего ListActivity.
Вот что вам нужно сделать:

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

 private class MyAdapter extends ArrayAdapter implements OnClickListener { public MyAdapter(Context context, int resource, int textViewResourceId, List objects) { super(context, resource, textViewResourceId, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { String text = getItem(position); if (null == convertView) { convertView = mInflater.inflate(R.layout.custom_row, null); } //take the Button and set listener. It will be invoked when you click the button. Button btn = (Button) convertView.findViewById(R.id.button); btn.setOnClickListener(this); //set the text... not important TextView tv = (TextView) convertView.findViewById(R.id.text); tv.setText(text); //!!! and this is the most important part: you are settin listener for the whole row convertView.setOnClickListener(new OnItemClickListener(position)); return convertView; } @Override public void onClick(View v) { Log.v(TAG, "Row button clicked"); } } 

Класс OnItemClickListener можно объявить здесь:

 private class OnItemClickListener implements OnClickListener{ private int mPosition; OnItemClickListener(int position){ mPosition = position; } @Override public void onClick(View arg0) { Log.v(TAG, "onItemClick at position" + mPosition); } } 

Конечно, вы, вероятно, добавите еще несколько параметров в конструктор OnItemClickListener.
И одна важная вещь – реализация getView, показанная выше, довольно уродлива, обычно вам нужно использовать шаблон ViewHolder, чтобы избежать вызовов findViewById .. но вы, вероятно, уже знаете это.
Мой файл custom_row.xml – RelativeLayout с кнопкой «id», TextView идентификатора «text» и ImageView id «image» – просто для того, чтобы все было ясно.
С уважением!

Когда пользовательский ListView содержит настраиваемые элементы, onListItemClick не будет работать (я думаю, что это ожидаемое поведение). Просто удалите фокус с пользовательского представления, он будет делать трюк:

Например:

 public class ExtendedCheckBoxListView extends LinearLayout { private TextView mText; private CheckBox mCheckBox; public ExtendedCheckBoxListView(Context context, ExtendedCheckBox aCheckBoxifiedText) { super(context); … mText.setFocusable(false); mText.setFocusableInTouchMode(false); mCheckBox.setFocusable(false); mCheckBox.setFocusableInTouchMode(false); … } } 

У меня такая же проблема: OnListItemClick не уволен! [Решено]
Это происходит в classе, расширяющем ListActivity,
с макетом для ListActivity, что содержимое TextBox и ListView вложены в LinearLayout
и другой макет для строк (CheckBox и TextBox, вложенные в LineraLayout).

Это код:

res / layout / configpage.xml (основной для ListActivity)

      res/layout/row.xml (layout for single row)     

src /…/…/ ConfigPage.java

 public class ConfigPage extends ListActivity { TextView selection; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.configpage); // loaded from res/value/strings String[] azioni = getResources().getStringArray(R.array.ACTIONS); setListAdapter(new ArrayAdapter<String>(this, R.layout.row, R.id.testo, azioni)); selection = (TextView) findViewById(R.id.selection); } public void onListItemClick(ListView parent, View view, int position, long id) { selection.setText(" " + position); } } 

Это начинает работать, когда я добавил в row.xml

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

Я использую Eclipse 3.5.2
Android SDK 10.0.1
мин SDK версия: 3

Я надеюсь, что это полезно
… и извините за мой английский 🙁

просто добавьте android:focusable="false" как один из атрибутов вашей кнопки

У меня была та же проблема с ToggleButton. Через полдня, ударив головой о стену, я наконец решил ее. Это так же просто, как сделать фокусируемое представление неосведомленным, используя «android: focusable». Вы также должны избегать игры с фокусируемостью и интерактивностью (только что составленными словами) строки списка, просто оставьте их со значением по умолчанию.

Конечно, теперь, когда ваши фокусные представления в строке списка не поддаются фокусировке, пользователи, использующие клавиатуру, могут иметь проблемы, а также фокусировать их. Это вряд ли будет проблемой, но на всякий случай, если вы хотите написать 100% безупречных приложений, вы можете использовать событие onItemSelected, чтобы сделать элементы выбранной строки ориентированными и элементы ранее выбранной строки неактивны.

  ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) { // When clicked, show a toast with the TextView text Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); } }); 

Я использовал getListAdapter (). GetItem (position), создающий экземпляр объекта, который содержит мои значения внутри элемента

 MyPojo myPojo = getListAdapter().getItem(position); 

затем использовал метод getter из myPojo, он будет вызывать его правильные значения внутри элемента.

  • Виджет для включения / выключения фонарика камеры в android
  • Как показать Dialog в методе onCreate?
  • Как сделать виджет расширяемого / сжимаемого раздела в QT
  • Android Home Screen Widget (значок, стиль ярлыка)
  • Запуск активности из виджета
  • Android: изменение вкладки Цвет текста программно
  • Возможно ли для TextView Marquee в виджетах расширить приложение AppWidgetProvider?
  • Есть ли простой способ нанести удар по тексту в виджетах приложения?
  • Обработка более одного нажатия кнопки на Android Widget
  • Как отобразить два столбца ListView в Android?
  • Есть ли пример с текстом Spanned и Spannable?
  • Давайте будем гением компьютера.