【问题标题】:Scroll a ListView by pixels in Android在Android中按像素滚动ListView
【发布时间】:2011-01-23 10:08:56
【问题描述】:

我想在 Android 中按像素数滚动 a ListView。例如,我想将列表向下滚动 10 个像素(以便列表中的第一项隐藏其前 10 个像素行)。

我认为 ListView 上明显可见的 scrollByscrollTo 方法可以完成这项工作,但它们没有,而是错误地滚动整个列表(事实上,getScrollY 总是返回零,即使我已经用我的手指滚动了列表。)

我正在做的是捕捉轨迹球事件,我想根据轨迹球的运动平滑滚动列表视图。

【问题讨论】:

  • 这是scrollby 应该做的。你能发布你的Java代码吗?
  • 我认为 scrollBy 以某种方式弄乱了 listView。我也一直在试验那个。它通过scrollBy量移动触摸事件....因此,如果您将y滚动设置为10,例如,列表中的下一个触摸事件将是实际触摸位置下方10个像素的市场..对不起,我不知道一种更好的方法,但也许有一种方法可以通过 listView 上的 onTouch 方法来弥补这一点。

标签: android listview scroll


【解决方案1】:

支持滚动 ListView 小部件的方式是:

mListView.smoothScrollToPosition(position);

http://developer.android.com/reference/android/widget/AbsListView.html#smoothScrollToPosition(int)

但是由于您特别提到要垂直偏移视图,因此您必须调用:

mListView.setSelectionFromTop(position, yOffset);

http://developer.android.com/reference/android/widget/ListView.html#setSelectionFromTop(int,%20int)

请注意,您也可以使用smoothScrollByOffset(yOffset)。但是它只支持 API >= 11

http://developer.android.com/reference/android/widget/ListView.html#smoothScrollByOffset(int)

【讨论】:

  • 另外,smoothScoolToPosition 只是 API >= 8 :(
【解决方案2】:

这是来自我的ListView 子类的一些代码。它可以很容易地进行调整,因此可以在 Activity 代码中使用。

getListItemsHeight() 返回列表的总像素高度,并用每个项目的垂直像素偏移量填充数组。当此信息有效时,getListScrollY() 返回当前垂直像素滚动位置,scrollListToY() 将列表滚动到像素位置。 如果列表的大小或内容发生变化,则必须再次调用getListItemsHeight()

private int m_nItemCount;
private int[] m_nItemOffY;

private int getListItemsHeight() 
{  
    ListAdapter adapter = getAdapter();  
    m_nItemCount = adapter.getCount();
    int height = 0;
    int i;

    m_nItemOffY = new int[m_nItemCount];

    for(i = 0; i< m_nItemCount; ++i){ 
        View view  = adapter.getView(i, null, this);  

        view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  

        m_nItemOffY[i] = height;
        height += view.getMeasuredHeight();
    }  

    return height;  
}  

private int getListScrollY()
{
    int pos, nScrollY, nItemY;
    View view;

    pos = getFirstVisiblePosition();
    view = getChildAt(0);
    nItemY = view.getTop();
    nScrollY = m_nItemOffY[pos] - nItemY;

    return nScrollY;
}

private void scrollListToY(int nScrollY)
{
    int i, off;

    for(i = 0; i < m_nItemCount; ++i){
        off = m_nItemOffY[i] - nScrollY;
        if(off >= 0){
            setSelectionFromTop(i, off);
            break;
        }
    }
}

【讨论】:

    【解决方案3】:

    如果您查看 api 19 中添加的 scrollListBy() 方法的源代码,您会发现您可以使用范围为 trackMotionScroll 的包方法。

    public class FutureListView {
    
        private final ListView mView;
    
        public FutureListView(ListView view) {
            mView = view;
        }
    
        /**
         * Scrolls the list items within the view by a specified number of pixels.
         *
         * @param y the amount of pixels to scroll by vertically
         */
        public void scrollListBy(int y) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                mView.scrollListBy(y);
            } else {
                // scrollListBy just calls trackMotionScroll
                trackMotionScroll(-y, -y);
            }
        }
    
        private void trackMotionScroll(int deltaY, int incrementalDeltaY) {
            try {
                Method method = AbsListView.class.getDeclaredMethod("trackMotionScroll", int.class, int.class);
                method.setAccessible(true);
                method.invoke(mView, deltaY, incrementalDeltaY);
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            };
        }
    }
    

    【讨论】:

    【解决方案4】:

    如果你想移动像素那么你可以使用这个

    public void scrollBy(ListView l, int px){
        l.setSelectionFromTop(l.getFirstVisiblePosition(),l.getChildAt(0).getTop() - px);
    }
    

    这适用于具有大量标题的人

    【讨论】:

      【解决方案5】:

      目前,ListViewCompat 可能是更好的解决方案。

      android.support.v4.widget.ListViewCompat.scrollListBy(@NonNull ListView listView, int y)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多