ListView
行的 OnItemClickListener
被禁用了,因为在行布局中有一个 ImageButton
,它接管了焦点。我发现了许多类似的问题,但没有一个能帮我解决。
我查看了这个问题,但我无法理解其中的内容。我只需要一种方法,使得行可以被点击,以便我可以检测到何时按下行,长按和聚焦都可以正常工作。
在您的适配器中为每个视图添加一个OnClickListener,而不是使用OnItemClickListener。您需要使用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()
。
setFocusable(false);
setClickable(false);
在适配器的 getView()
中不设置为 true 而是在那里执行想要的操作,这样就可以调用 OnItemClickListener
(前提是在 getView()
中没有设置 OnClickListener
)。我认为这才是原始问题所想要的。
我假设你可以在 View 的 OnClickListener
中做的任何事情都可以在 ListView
的 OnItemClickListener
中同样轻松地完成。(在 View 上设置 setOnClickListener
隐式地将该视图设置为可点击状态,这会防止 ListView
对应的 OnItemClickListener
被调用。)
在按下或滑过项时,ImageButton
的可视状态与预期一致。
这个解决方案有一个小小的幻觉,即被按下的是列表项而不是 ImageButton
本身,因此,如果按钮不占据整个列表项,则在项目的其他位置单击仍会使按钮的可绘制状态反映出单击。聚焦也是一样的。这可能是值得付出的代价。
android:descendantFocusability="blocksDescendants"
,并且不在从getView()方法返回的视图上设置 OnClickListener
,这样可以实现你想要的效果。在单独的项目上设置 OnClickListener
仍然有效。 - JulianSymes最好的方法是这样的:
android:focusable="false"
android:focusableInTouchMode="false"
设置这些属性来尝试使用Imagebutton
。
为了避免为每个视图设置OnClickListener
,可以选择不使用ImageButton
,而改用ImageView
。 ImageView
仍然可以将事件发送给OnClickListener
,并且不会占据焦点。
针对我的这个问题,问题出在我将 TextView
对象设置为 android:inputType="textMultiLine"
。 当我删除了这行代码后,列表无法点击的问题消失了。 看起来是一个很讨厌的小bug。
此外,我仍然可以毫无问题地使用 android:minLines/android:maxLines
属性,所以这并不是一个大问题。 只是不是我期望的解决方案。
<TextView ... android:textIsSelectable="false" />
BaseAdapter
扩展你的适配器(而不是实现ListAdapter
接口)。我已经对ImageButton
进行了子类化,并且在布局定义中使用setFocusable ="false"
无法解决我的问题。这个问题可以通过在子类的构造函数中调用setFocusable(false)
来解决。
CursorAdaptor
的newView()
中执行它,而不是在getView()
中执行它,那么它就无法正常工作。出了什么问题? - faizal