【问题标题】:ListView scroll - one by oneListView 滚动 - 一个一个
【发布时间】:2012-05-29 06:30:05
【问题描述】:

我有一个必须一次显示 4 个项目的 ListView。而且我必须逐项滚动。

用户滚动 ListView 后,我必须重新调整滚动以适应 4 个项目。我的意思是,我不能将一个项目显示一半。

另外一个问题,有什么办法可以得到当前 ListView 的 scrollY 偏移量吗?因为listView.getScrollY()方法来自View,而不是ListView里面的Scroller对象。

【问题讨论】:

    标签: android android-widget android-listview


    【解决方案1】:

    我找到了一个很好的解决方案。它对我来说很完美。 可能是我的回答会帮助某人。

    class ScrollListener implements AbsListView.OnScrollListener{
            boolean aligned;
    
            @Override
            public void onScrollStateChanged(AbsListView absListView, int state) {
                if (state == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                    aligned = false;
                }
                if (state == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                    if (!aligned) {
                        if (Math.abs(absListView.getChildAt(0).getY()) < Math.abs(absListView.getChildAt(1).getY())) {
                            listView.smoothScrollToPosition(absListView.getFirstVisiblePosition());
                        } else {
                            listView.smoothScrollToPosition(absListView.getLastVisiblePosition());
                        }
                    }
                    aligned = true;
                }
            }
    
            @Override
            public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            }
        }
    

    我必须说,在我的情况下,我有两个可见的项目,所以如果你有 4 个,你应该使用索引("getChildAt(0)" and "getChildAt(1)")。 祝你好运!

    【讨论】:

    • 查看answer 以获得平滑滚动效果
    【解决方案2】:

    您可以在 ScrollView 上实现传感器“OnTouchListener”。 然后该技术是在该人没有至少滚动到项目的高度之前不滚动。 代码示例:

    scroll.setOnTouchListener(new OnTouchListener()
    {
         private int mLastY;
         public boolean onTouch(View v, MotionEvent event) 
         {          
            switch (event.getAction()) 
            {
                case MotionEvent.ACTION_DOWN:   //the user places his finger on the screen
                    mLastY=(int)event.getY();   //to get the "y" position starting
                    break;
                case MotionEvent.ACTION_MOVE:
                    if(mLastY-event.getY() >= theSizeOfItem) //if a movement of the size of an item occurs
                    {   
                        scroll.scrollTo(0, scroll.getScrollY()+ theSizeOfItem));
                        scroll.invalidate();
                        mLastY=(int)event.getY();   //reset the starting position to the current position                       
    
                    }
                    if(event.getY()-mLastY >= theSizeOfItem) //if a movement of the size of an item occurs
                    {   
                        scroll.scrollTo(0, scroll.getScrollY() - theSizeOfItem));
                        scroll.invalidate();
                        mLastY=(int)event.getY();   //reset the starting position to the current position                       
    
                    }
                    break;
                default:
                    break;
            }
            return v.onTouchEvent (event); //to use other sensors (OnClick, OnLongClick, ...)
        }});
    

    然后必须实现滚动到达末尾的情况!对不起我的英语,希望对你有帮助

    【讨论】:

    • 是的,它是这样工作的,谢谢。但是 ScrollView 不使用适配器。在我的场景中,我必须使用带有 ListView 的适配器,因为我需要一个无限循环,并且使用适配器更容易做到。ListView 的问题是你无法获得它的滚动实际偏移量。
    • 如果我了解您的问题。解决方案是使用带有适配器的 GridView,这样你就可以得到准确的位置值。
    猜你喜欢
    • 2021-11-28
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多