ListView OnItemClickListener не отвечает?
Я искал везде решение для этого, но я не могу понять, как его реализовать. Мой OnItemClickListener
был отключен как-то на моих ListView
строках, потому что у меня есть ImageButton
в макете строк, который берет фокус. Были многочисленные вопросы, которые я нашел, но ни один из них не доставил меня никуда.
Я проверил этот вопрос, но я не мог сделать из него головы или хвосты. Мне просто нужен способ, чтобы строки были удобными, чтобы я мог обнаружить, когда строка нажата. Длительное нажатие и фокусировка работают нормально.
Ответы
Ответ 1
Вместо OnItemClickListener добавьте OnClickListener к каждому из ваших представлений, возвращаемых вашим адаптером. Вам нужно будет использовать setItemsCanFocus
настройку списка:
ListView list = (ListView) findViewById(R.id.myList);
list.setAdapter(new DoubleClickAdapter(this));
list.setItemsCanFocus(true);
а затем в вашем адаптере getView
, это приведет к кликабельной строке. Предполагается, что кнопка находится в надутом xml.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(context, R.layout.cell, null);
view.setClickable(true);
view.setFocusable(true);
view.setBackgroundResource(android.R.drawable.menuitem_background);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new AlertDialog.Builder(context).setTitle("touched").show();
}
});
return view;
}
Ответ 2
установите свой атрибут ImageButton
:
android:focusable="false"
Потому что AbsListView.onTouchEvent
проверьте child.hasFocusable()
.
Ответ 3
Я тестировал следующее решение на уровнях SDK 8 и 16.
В getView()
setFocusable(false);
setClickable(false);
вместо того, чтобы устанавливать их true в адаптере getView()
, делает то, что, как мне кажется, требует первоначальный запрос, и означает, что вызов OnItemClickListener
вызывается, при условии, что OnClickListener
не установлен в getView()
.
Я предполагаю, что все, что вы можете сделать в View OnClickListener
, можно сделать так же легко в ListView
OnItemClickListener
.
(setOnClickListener
в представлении неявно задает возможность кликабельности, что предотвращает вызов ListView
OnItemClickListener
, видимо.)
Поведение такое же, как можно было бы ожидать, в виде визуального состояния ImageButton
при нажатии или перетаскивании элемента.
Решение - небольшая иллюзия, поскольку элемент списка не нажат не сам ImageButton
, поэтому, если кнопка не занимает весь элемент списка, щелчок в другом месте элемента все равно сделает кнопку выталкиваемое состояние отражает щелчок. То же самое для фокуса. Это может стоить цена.
Ответ 4
Это определенно сработает. Добавьте это в определение макета.
android:descendantFocusability="blocksDescendants"
Найденное решение здесь
Ответ 5
Альтернативой установке OnClickListener
для каждого представления является НЕ использовать ImageButton
- вместо этого использовать ImageView
. ImageView
все равно может отправлять события в OnClickListener
и не будет занимать фокус.
Ответ 6
лучший способ сделать это:
android:focusable="false"
android:focusableInTouchMode="false"
задайте эти свойства для этого Imagebutton
и попробуйте.
I
Ответ 7
В моей версии этой проблемы проблема заключалась в том, что я установил для моего объекта TextView
значение android:inputType="textMultiLine"
. Когда я удалил эту строку, вопрос о том, что список не доступен для клика, исчез. Похож на неприятную маленькую ошибку.
Кроме того, я все еще могу использовать свойства android:minLines/android:maxLines
без проблем, так что это не большая проблема. Просто не решение, которое я ожидал.
Ответ 8
В качестве альтернативного решения, которое работало для меня, вы можете попробовать расширить свой адаптер от BaseAdapter
(iso реализации ListAdapter
интерфейса)
Ответ 9
Следующая строка решила проблему в моем проекте:
<TextView ... android:textIsSelectable="false" />
Ответ 10
Поместите этот код ImageView nextpage= (ImageView)findViewById(R.id.btnEdit);
вместо ImageButton
. теперь элемент списка активен
Ответ 11
У меня есть подклассы ImageButton
и setFocusable="false"
в определении макета для меня не работает. Он решил вызвать setFocusable(false)
в конструкторе подкласса.
Ответ 12
listView= (ListView) findViewById(R.id.listview_names);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Toast.makeText(getBaseContext(),"Clicked Button",Toast.LENGTH_LONG).show();
Log.d("h","clicked");
/* Intent intent=new Intent(MainActivity.this,Display_data.class);
intent.putExtra("NAME",n);
intent.putExtra("AGE",a);
startActivity(intent);*/
}
});
Y этот тост не работает
Ответ 13
Использование ScrollView
может помешать onItemClickListener
получить вход.
Надеюсь, это поможет кому угодно.