如何在 android ListView 的分页滚动中滚动到最后一页正常工作

How can I have scrolling to last page working properly in a paginated scroll in android ListView

注意! 这个问题不是关于将项目动态加载到一个很长的 ListView 中。

这是关于向 ListView 添加 PageUP 和 PageDown 按钮,以便用户可以触摸按钮并逐页滚动 ListView。页面表示屏幕上所有完全可见和部分可见的项目。

我已经在下面的代码中部分实现了这个,但我的问题是当我在列表视图中假设 10 个高度大致相同的项目并且其中 7 个适合第一页时,然后当我按下 PgDown 按钮时,用户希望项目 8 位于屏幕顶部(下一页),但是因为只有 10 个项目,ListView 滚动到列表底部并且因为没有额外的滚动 space 我有项目编号4 在上面。 在这种情况下最好的解决方案是什么? 我应该在列表的末尾添加一个项目,使最后一页成为屏幕的高度,还是有更好的选择?

这是我的代码:

public class cPaginatedListViewHelper {
Activity m_parentActivity;
private ListView mList;

//controls
private LinearLayout m_PagingLL;

//buttons
private ImageButton m_btnPrevPage;
private ImageButton m_btnNextPage;
private ImageButton m_btnExitPaginatedMode;


public cPaginatedListViewHelper(ListActivity mParent) {
    this.m_parentActivity = mParent;

    m_btnPrevPage=(ImageButton) mParent.findViewById(R.id.btnPrevPage);
    m_btnNextPage=(ImageButton) mParent.findViewById(R.id.btnNextPage);
    m_btnExitPaginatedMode =(ImageButton) mParent.findViewById(R.id.btnClosePage);

    if(m_btnPrevPage!=null) {
        m_btnPrevPage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showSiblingPage(-1);
            }
        });
        m_btnPrevPage.setOnLongClickListener(new View.OnLongClickListener() {
                                         @Override
                                         public boolean onLongClick(View v) {
                                             mList.smoothScrollToPosition(0);
                                             return true;
                                         }
                                             }
        );
    }
    if(m_btnNextPage!=null) {
        m_btnNextPage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showSiblingPage(1);
            }
        });
        m_btnNextPage.setOnLongClickListener(new View.OnLongClickListener() {
                                                 @Override
                                                 public boolean onLongClick(View v) {
                                                     mList.smoothScrollToPosition(mList.getCount());
                                                     return true;
                                                 }
                                             }
        );
    }
    m_btnExitPaginatedMode.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setEnabled(false);
            m_PagingLL.setVisibility(View.GONE);
        }
    });

    mList=mParent.getListView();
    m_PagingLL = (LinearLayout) mParent.findViewById(R.id.pageControls);

}

public void updateControlsVisibility()
{
    ViewTreeObserver observer = mList.getViewTreeObserver();
    observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            if (willMyListScroll()) {
                boolean psm = isEnabled();
                //enable or disable
                m_PagingLL.setVisibility( psm ? View.VISIBLE : View.GONE);

                ((View)mList).setVerticalScrollbarPosition(psm ? View.SCROLLBAR_POSITION_LEFT: View.SCROLLBAR_POSITION_RIGHT);

            }
            else
            {
                m_PagingLL.setVisibility(View.GONE);
                ((View)mList).setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_RIGHT);
            }
        }
    });
}

private boolean willMyListScroll() {
    try {
        int pos = mList.getLastVisiblePosition();
        if (mList.getChildAt(pos).getBottom() > mList.getHeight()) {
            return true;
        } else {
            return false;
        }
    } catch (Exception e) {
        e.printStackTrace();

    }
    return false;
}


private void showSiblingPage(int shift)
{
    if(mList!=null) {
        int iScrollPageHeight = mList.getHeight();
        mList.scrollListBy(iScrollPageHeight * shift);
    }
}


public void setEnabled(boolean psm) {
    MyApp.Pref.edit().putBoolean("PSModeEnabled", psm).commit();
}

public boolean isEnabled(){
    return MyApp.Pref.getBoolean("PSModeEnabled", false);
}


public void pagedScrollEnableDisable() {
    boolean pagingEnabled = isEnabled();
    pagingEnabled=!pagingEnabled;
    setEnabled(pagingEnabled);
    m_PagingLL.setVisibility( pagingEnabled ? View.VISIBLE : View.GONE);
    updateControlsVisibility();
}

}

我完成了使用具有可变高度的 ListView 的页脚,如下面的代码所示:

                LayoutInflater inflater = m_parentActivity.getLayoutInflater();
                m_footerView = inflater.inflate(R.layout.listview_paged_overscroll, mList, false );
                ViewGroup.LayoutParams lp =m_footerView.getLayoutParams();

                if(m_tvPageNum!=null) recalcPagination();
                if(lp!=null) lp.height = m_extraScrollFooterHeight;
                int iFooters = mList.getFooterViewsCount();
                if(iFooters==0) mList.addFooterView(m_footerView);