【发布时间】:2011-01-23 00:01:21
【问题描述】:
我到处寻找解决方案,但我不知道如何实现它。我的OnItemClickListener 在我的ListView 行上以某种方式被禁用,因为我在行布局中有一个ImageButton,它接管了焦点。我发现了很多问题,但没有一个问题能帮我解决问题。
我已经检查了this 的问题,但我无法真正确定它的正面或反面。我只需要一种方法来获取可点击的行,这样我就可以检测到何时按下了一行。长按和对焦可以正常工作。
【问题讨论】:
我到处寻找解决方案,但我不知道如何实现它。我的OnItemClickListener 在我的ListView 行上以某种方式被禁用,因为我在行布局中有一个ImageButton,它接管了焦点。我发现了很多问题,但没有一个问题能帮我解决问题。
我已经检查了this 的问题,但我无法真正确定它的正面或反面。我只需要一种方法来获取可点击的行,这样我就可以检测到何时按下了一行。长按和对焦可以正常工作。
【问题讨论】:
将 OnClickListener 添加到从适配器返回的每个视图中,而不是 OnItemClickListener。您需要使用setItemsCanFocus 设置您的列表:
ListView list = (ListView) findViewById(R.id.myList);
list.setAdapter(new DoubleClickAdapter(this));
list.setItemsCanFocus(true);
然后在您的 Adapter 的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()。
【讨论】:
我已经在 SDK 级别 8 和 16 上测试了以下解决方案。
在getView()
setFocusable(false);
setClickable(false);
而不是在适配器的 getView() 中将它们设置为 true,而是按照我认为原始问题想要的方式进行,这意味着如果 OnClickListener 未在 getView() 中设置,则会调用 OnItemClickListener。
我假设您可以在 View 的 OnClickListener 中执行的任何操作都可以在 ListView 的 OnItemClickListener 中轻松执行。
(视图上的setOnClickListener 隐式地将视图设置为可点击,这显然可以防止ListView 对应的OnItemClickListener 被调用。)
就ImageButton 在项目被按下或翻转时的视觉状态而言,行为与预期的一样。
解决方案有点错觉,因为它是被按下的列表项而不是ImageButton 本身,所以如果按钮没有占据整个列表项,单击项目中的其他位置仍然会使按钮可绘制状态反映点击。对焦也一样。这可能是值得付出的代价。
【讨论】:
android:descendantFocusability="blocksDescendants" 而不是在您的视图上设置 OnClickListener 来实现您想要的从 getView() 返回。在单个项目上设置 OnClickListeners 仍然有效。
【讨论】:
为每个视图设置OnClickListener 的另一种方法是不使用ImageButton - 改用ImageView。 ImageView 仍然可以将事件发送到 OnClickListener 并且不会接管焦点。
【讨论】:
最好的方法是:
android:focusable="false"
android:focusableInTouchMode="false"
为Imagebutton 设置这些属性并尝试。
我
【讨论】:
对于我这个问题的版本,问题是我将我的TextView 对象设置为android:inputType="textMultiLine"。当我删除这一行时,列表不可点击的问题就消失了。看起来像个讨厌的小虫子。
另外,我仍然可以毫无问题地使用android:minLines/android:maxLines 属性,所以这不是什么大问题。只是不是我期望的解决方案。
【讨论】:
以下行解决了我项目中的问题:
<TextView ... android:textIsSelectable="false" />
【讨论】:
作为对我有用的替代解决方案,您可以尝试从 BaseAdapter 扩展您的适配器(iso 实现 ListAdapter 接口)
【讨论】:
把这个代码 ImageView nextpage= (ImageView)findViewById(R.id.btnEdit); 代替 ImageButton 。现在列表项处于活动状态
【讨论】:
我在布局定义中对@987654321@ 和setFocusable="false" 进行了子分类,但对我不起作用。它解决了在子类的构造函数中调用setFocusable(false)。
【讨论】:
使用ScrollView 可以阻止onItemClickListener 接收输入。
希望这对任何人都有帮助。
【讨论】: