Android ListView中的按下高亮效果

3

我已经在谷歌上搜了几个小时,SO上有很多问题,一些有被接受的答案,但它们不太好理解。

我有一个ListView,我希望在触摸时高亮显示某个项目,但如果用户移动手指并且没有“完成”触摸(当他们抬起手指时手指在视图之外),则高亮应该消失。

如果我尝试通过在我的View中包含以下内容来消耗触摸:

onTouch(View view, MotionEvent ev) {

   ....logic

   //return false so this view keeps consuming the touches
   return false;

}

触摸事件无法传递到ListView,因此onItemClick永远不会被调用。我可以通过将我的适配器设置为所有视图的侦听器并将“完整”的触摸事件传递给适配器来解决此问题,然后适配器将其传回ListView,然后再传递给其他人,但这似乎太荒谬了。
就记录而言,我正在尝试执行的突出显示是一种相对复杂的方法(涉及更改多个动态子视图的背景色),因此我不能只使用一个StateDrawable。..至少我认为不能,StateDrawables是否适用于多个子视图?
iOS可以很简单地在其UITableViewDelegate中处理此问题,看起来在Android上如此困难,我一定错过了什么。非常感谢您的帮助。

为什么不使用简单选择器? - Gil Vegliach
我对Android开发还比较新,Gil。如果可以的话,我很想要一个链接、示例或者至少是你评论的详细说明。我在考虑是否可行,因为需要突出显示的子视图具有动态性质,所以可能无法定义“drawable”,但我愿意听取建议。 - Adam Jenkins
1个回答

1
  • 在列表项上使用选择器。

在res/drawable中定义一个名为'item_sel.xml'的选择器,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/my_highlight_color" android:state_pressed="true"/>
    <item android:drawable="@color/my_default_color"/>
</selector>

其中my_default_colormy_highlight_color是由您定义的颜色,例如在res/values/colors.xml中。然后将此选择器设置为您的item视图(而不是ListView)的背景,即:

 android:background="@drawable/item_sel.xml"

从这里开始,您应该可以顺利进行。


我要找的是duplicateParentState属性。结合选择器,让它对我起作用了。就像我说的,我对Android还很陌生,仍在努力弄清楚每个东西的含义——在文档中找到duplicateParentState时感觉恍然大悟。 - Adam Jenkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接