bugfix> android > 投稿

注意! この質問は、非常に長いリストビューへのアイテムの動的なロードに関するものではありません。

これは、PageUPおよびPageDownボタンをListViewに追加して、ユーザーがボタンに触れてListViewをページごとにスクロールできるようにすることです。ページとは、画面上のすべてまたは部分的に見えるすべてのアイテムを意味します。

私はこれを次のコードで部分的に実装しましたが、私の問題は、リストビューでほぼ同じ高さの10個のアイテムと7個が最初のページに収まるようにし、PgDownボタンを押すと、ユーザーがそのアイテムを期待することです8は画面(次のページ)の一番上にありますが、10個のアイテムしかないため、ListViewはリストの一番下までスクロールし、余分なスクロールスペースがないため、アイテム番号4が一番上にあります。 この状況で最善の解決策は何ですか? リストの最後に1つの項目を追加して、最後のページを画面の高さにする必要がありますか、それともより良いオプションがありますか?

ここに私のコードがあります:

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();
}

}

回答 1 件
  • 次のコードに示すように、可変の高さの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);
    
    

あなたの答え