Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android ListView中,如何使滚动到最后一页在分页滚动中正常工作_Android_Listview_Vertical Scrolling - Fatal编程技术网

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

在android ListView中,如何使滚动到最后一页在分页滚动中正常工作,android,listview,vertical-scrolling,Android,Listview,Vertical Scrolling,注意这个问题不是关于将项目动态加载到很长的ListView中 这是关于向ListView添加PageUP和PageDown按钮,以便用户可以触摸按钮并逐页滚动ListView。页面是指屏幕上所有完全和部分可见的项目 我在下面的代码中部分实现了这一点,但我的问题是,当我在listview中设置了10个高度大致相同的项目,其中7个项目放入第一页时,当我按下PgDown按钮时,用户希望项目8位于屏幕顶部(下一页),但因为只有10个项目,ListView滚动到列表的底部,因为没有额外的滚动空间,所以我在

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

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

我在下面的代码中部分实现了这一点,但我的问题是,当我在listview中设置了10个高度大致相同的项目,其中7个项目放入第一页时,当我按下PgDown按钮时,用户希望项目8位于屏幕顶部(下一页),但因为只有10个项目,ListView滚动到列表的底部,因为没有额外的滚动空间,所以我在顶部有项目编号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);