Не может нажимать на строку listview с помощью кнопки изображения
У меня проблемы со списком. его элементы (строки) имеют кнопку изображения.
imagebutton имеет "android: onClick", поэтому это событие onclick работает, но щелчок на строке не работает. если я удаляю кнопку изображения из строки, нажмите на работу строки (listview имеет правильный onclick listner). Как я могу это исправить? Мне нужно событие onclick, когда пользователь нажимает на кнопку изображения и стандартное событие click, когда пользователь выбирает строку (не нажимайте кнопку изображения, а выбираем строку)
мой список:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/restaurants_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@color/list_devider"
android:dividerHeight="1dp"
android:cacheColorHint="@color/list_background" />
Ответы
Ответ 1
К сожалению,
android:focusable="false"
android:focusableInTouchMode="false"
не работает для ImageButton
.
Наконец я нашел решение здесь. В вашем макете xml для этих элементов добавьте
android:descendantFocusability="blocksDescendants"
в корневом представлении.
Он отлично работает для ListView
, имеющего ImageButton
s. Согласно официальной ссылке blocksDescendants
означает, что ViewGroup
заблокирует его потомки от получения фокуса.
Ответ 2
Вы можете использовать пользовательский адаптер для своего списка (если вы еще этого не сделали). И там, в методе getView(int position, View inView, ViewGroup parent)
адаптера сделать что-то вроде этого:
@Override
public View getView(int position, View inView, ViewGroup parent) {
View v = inView;
ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview
if (v == null) {
LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) v.findViewById(R.id.ImageView);
v.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) v.getTag();
}
.....
viewHolder.image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Click on imageView
}i
});
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Click on listView row
}
});
.....
return (v);
}
Смотрите здесь, если вам нужна помощь в создании настраиваемого адаптера.
Ответ 3
Если в строке listView есть любой элемент с кликабером, такой как Button
, Image
.. и т.д., тогда onItemClick
не будет работать. Поэтому вам нужно написать прослушиватель кликов в getView
вашего адаптера списка.
Подробнее читайте .
Ответ 4
Задайте эти свойства для своей кнопки:
android:focusable="false"
android:focusableInTouchMode="false"
Или вы можете установить его динамически в своем классе адаптера:
yourButton.setFocusable(false);
yourButton.setFocusableInTouchMode(false);
И убедитесь, что вы выбрали режим выбора как одиночный для списка:
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
Ответ 5
Если строка содержит несколько элементов, которые можно щелкнуть, onItemClick() не будет работать. Вам нужно будет установить OnClickListener
в методе getView()
. Храните слушатели в теге "Вид", чтобы их можно было перерабатывать, добавлять методы к вашим слушателям, чтобы они могли быть специализированы для разных строк.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
RowClickListeners listeners = (RowClickListeners) view.getTag();
if (listeners == null) {
listeners = new RowClickListeners();
}
// Row click listener:
RowClickListener onClickListener = listeners.rowClickListener;
if (onClickListener == null) {
onClickListener = new RowClickListener();
listeners.rowClickListener = onClickListener;
}
onClickListener.setToPosition(pos);
view.setOnClickListener(onClickListener);
// Overflow listener:
View btn = view.findViewById(R.id.ic_row_btn);
ButtonListener btnListener = listeners.buttonClickListener;
if (rowListener == null) {
btnListener = new ButtonListener(activity);
listeners.rowClickListener = btnListener;
}
btnListener.setToPosition(pos);
btnListener.setCollection(collectionId);
btn.setOnClickListener(btnListener);
}
public static class RowClickListeners {
public RowClickListener rowClickListener;
public ButtonListener buttonClickListener;
}
Ответ 6
В моем случае android:descendantFocusability="blocksDescendants"
для основного слоя не работает, ни в ListView. Я также пробовал android:focusable="false"
android:focusableInTouchMode="false"
, который я слышал о том, что он работает для кнопок, но у меня был ImageButton, так что это не так.
Но настройка свойств кнопки в файле CS макета выполнена.
var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;
Ответ 7
ни один ответ выше не работал у меня, но комбинация сделала.
Теперь я устанавливаю android:descendantFocusability="blocksDescendants"
в ListView и android:focusable="false" android:focusableInTouchMode="false"
в ImageButtons в XML И в Java. Я также устанавливаю descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
в ListView и focusable(false), focusableInTouchMode(false), clickable(true)
на ImageButtons.