ListView OnItemClickListener не отвечает?
Я везде искал решение для этого, но я не могу понять, как его реализовать. мой OnItemClickListener
был отключен как-то на моем ListView
строки, потому что у меня есть ImageButton
в макете строки, которая берет на себя фокус. Было много вопросов, которые я нашел, но ни один из них никуда меня не привел.
Я проверил этот вопрос, но я не мог сделать из этого ни головы, ни хвоста. Мне просто нужен способ сделать строки кликабельными, чтобы я мог определить, когда строка нажата. Длительное нажатие и фокусировка работают нормально.
13 ответов
Вместо 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;
}
Установить свой ImageButton
атрибут:
android:focusable="false"
Так как AbsListView.onTouchEvent
проверять child.hasFocusable()
,
Я протестировал следующее решение на 8 и 16 уровнях SDK.
В getView()
setFocusable(false);
setClickable(false);
вместо того, чтобы установить их истинно в адаптере getView()
делает то, что, как я думаю, хотел первоначальный вопрос, и означает, что OnItemClickListener
вызывается при условии, что OnClickListener
не установлен в getView()
,
Я предполагаю, что все, что вы можете сделать в представлении OnClickListener
вы можете сделать так же легко в ListView
"s OnItemClickListener
, (setOnClickListener
в представлении неявно устанавливает вид для кликабельности, что предотвращает ListView
соответствует OnItemClickListener
звонят, видимо.)
Поведение, как и следовало ожидать, с точки зрения ImageButton
Визуальное состояние, когда элемент нажимается или переворачивается.
Решение - это небольшая иллюзия, так как нажимается элемент списка, а не ImageButton
сама по себе, поэтому, если кнопка не занимает весь элемент списка, нажатие где-либо еще в элементе будет по-прежнему отображать щелчок в состоянии рисования кнопки. То же самое для фокуса. Это может быть цена, которую стоит заплатить.
Это определенно будет работать. Добавьте это в определение макета.
android:descendantFocusability="blocksDescendants"
Нашел решение здесь
Лучший способ сделать это:
android:focusable="false"
android:focusableInTouchMode="false"
установить эти свойства для этого Imagebutton
и попробовать. я
Одна альтернатива настройке OnClickListener
для каждого представления не использовать ImageButton
- использовать ImageView
вместо. ImageView
все еще может отправлять события на OnClickListener
и не будет брать на себя фокус.
Для моей версии этой проблемы проблема заключалась в том, что я установил свой TextView
Возражать android:inputType="textMultiLine"
, Когда я удалил эту строку, проблема с отсутствием кликабельности списка исчезла. Похоже, неприятный маленький баг.
Кроме того, я все еще могу использовать android:minLines/android:maxLines
свойства без проблем, так что это не большая проблема. Только не решение, которое я ожидал.
Как альтернативное решение, которое сработало для меня, вы можете попробовать расширить свой адаптер от BaseAdapter
(iso внедряет ListAdapter
интерфейс)
Следующая строка решила проблему в моем проекте:
<TextView ... android:textIsSelectable="false" />
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);*/
}
});
У этого тоста не работает
Положить этот код ImageView nextpage= (ImageView)findViewById(R.id.btnEdit);
вместо ImageButton
, теперь элемент списка активен
Я субкласс ImageButton
а также setFocusable="false"
в определении макета не работает для меня. Решено призвание setFocusable(false)
в конструкторе подкласса.
Используя ScrollView
может предотвратить onItemClickListener
от получения ввода.
Надеюсь, это кому-нибудь поможет.