单击更改Android平滑滚动行为

单击更改Android平滑滚动行为,android,android-listview,onitemclicklistener,smooth-scrolling,Android,Android Listview,Onitemclicklistener,Smooth Scrolling,我有一个列表视图,我用一个定时器通过调用smoothScrollToPositionFromTop(位置、偏移、持续时间)来控制列表的滚动运动。ListView有一个用于OnItemClickListener的侦听器 如果在平滑滚动过程中单击某个项目,滚动将停止,但不会触发onItemClick事件。为此,您需要再次单击该项目 我想知道如何克服这种行为。我的意思是,如果在平滑滚动时单击某个项目,除了停止滚动之外,我还想在单击的项目上触发onimclick 我真的不知道是否有一个简单的方法来做到这

我有一个
列表视图
,我用一个
定时器
通过调用
smoothScrollToPositionFromTop(位置、偏移、持续时间)
来控制列表的滚动运动。
ListView
有一个用于
OnItemClickListener
的侦听器

如果在平滑滚动过程中单击某个项目,滚动将停止,但不会触发
onItemClick
事件。为此,您需要再次单击该项目

我想知道如何克服这种行为。我的意思是,如果在平滑滚动时单击某个项目,除了停止滚动之外,我还想在单击的项目上触发
onimclick


我真的不知道是否有一个简单的方法来做到这一点。我尝试使用
手势检测器
来检测列表中的
OnTouchListener
,然后我收听SingleTapConfiged上的
,以便在其中调用
performClick
,但是我不知道如何从
运动事件

中获取要按下的项目的位置,我最终使用
手势检测器找到了一个解决方案:

final GestureDetector gestureDetector = new GestureDetector(MyActivity.this, 
  new GestureDetector.SimpleOnGestureListener(){
    public boolean onSingleTapConfirmed(MotionEvent e) {
        int position = listView.pointToPosition((int)e.getX(), (int)e.getY());
        if(position != ListView.INVALID_POSITION){
            listView.playSoundEffect(SoundEffectConstants.CLICK);
            //onItemClick code goes here
            //or call listView.performItemClick
            return true;
        }
        return false;
    };
});

listView.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
});

listView.setSelector(android.R.color.transparent);
在我的例子中,我在
onItemClick
中添加了我在
OnSingletAPconfirm
中所做的事情,并从列表中删除了
onItemClick侦听器。这就是为什么我还添加了
playSoundEffect
函数来模拟点击

在最后一行中,我禁用了在
ListView
单击上高亮显示,因为只有在没有平滑滚动的情况下,行才会高亮显示。通过禁用它,我每次单击都会得到相同的行为