在 Android gridview 中设置第一个可见项完全可见[英] Set first visible item in Android gridview completely seen

问题描述

我有两列的gridview用户可以垂直滚动以查看 gridview 项目问题是当用户滚动完成时第一个可见行没有完全看到.我想将第一个可见行的顶部设置为 gridview 的顶部,因此第一行完全可见

有人可以帮我吗?

更新:第一项是在此处输入图片描述第二项是在此处输入图片描述

但滚动后我们看到在此处输入图片描述

推荐答案

你可以试试这个

grid.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView arg0, int scrollState) {
                //this is the state when scroll finish
                if(scrollState==SCROLL_STATE_IDLE)
                    //the first visible item is the first (even partially) visbile item
                    //setSelection will scroll the grid to the beginning of such item
                    grid.setSelection(firstVisibleItem);
            }

            @Override
            public void onScroll(AbsListView arg0, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            }
        });

其他推荐答案

我用的是 RecyclerView,希望对你有用!

mLayoutManager = new GridLayoutManager(getActivity(), 2);
mListRV= (RecyclerView).findViewById(R.id.list_rv);
mListRV.setLayoutManager(mLayoutManager);

mListRV.setOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                        View v = mLayoutManager.getChildAt(0);
                        int offsetTop = v.getTop();
                        int offsetBottom = v.getBottom();
                        int height = (offsetBottom - offsetTop);
                        if(offsetTop >= -height/2) {
                            mListRV.smoothScrollBy(0, offsetTop);
                        } else {
                            mListRV.smoothScrollBy(0, height + offsetTop);
                        }
                    } 
                }
            });

使用此代码,当您完成滚动时,如果第一个可见项仅显示 recyclerView 中的一部分.它将自动滚动以显示完整项目.您可以使用:

mLayoutManager.scrollToPositionWithOffset(position, offset);

但是它太快了,用户可能会感到困惑.而且您不需要使用 customLayoutManager 来编辑滚动的属性.

希望对你有帮助!

查看更多