单击时更改Android平滑滚动行为

时间:2012-10-09 15:02:22

标签: android android-listview onitemclicklistener smooth-scrolling

我有ListView并且Timer我通过调用smoothScrollToPositionFromTop(position, offset, duration)来控制此列表的滚动移动。 ListView有一个OnItemClickListener的监听器。

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

我想知道如何覆盖此行为。我的意思是,如果我在顺利滚动时点击某个项目,除了停止滚动之外,我想在点击的项目上触发onItemClick

我真的不知道是否有一种简单的方法可以做到这一点。我尝试使用GestureDetector获取列表的OnTouchListener并听取onSingleTapConfirmed以便在其中调用performClick,但我不知道如何获取正在按MotionEvent

的项目的位置

1 个答案:

答案 0 :(得分:0)

我终于找到了使用GestureDetector

的解决方案
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 onSingleTapConfirmed内添加了我正在做的事情,并从列表中删除了OnItemClickListener。这就是为什么我还添加了playSoundEffect函数来模拟点击。

在最后一行中,我在ListView点击时禁用突出显示,因为只有在没有发生平滑滚动时才突出显示行。通过禁用它,我每次点击都会得到相同的行为。