Как у меня может быть прокрутка до последней страницы, работающая должным образом в разбивке по страницам в Android ListView - PullRequest
0 голосов
/ 25 мая 2018

Внимание! Этот вопрос не о динамической загрузке элементов в очень длинный ListView.

Это о добавлении кнопок PageUP и PageDown в ListView, поэтомуэтот пользователь может коснуться кнопки и прокрутить ListView страницу за страницей.Страница означает все полностью и частично видимые элементы на экране.

Я частично реализовал это в следующем коде, но моя проблема в том, что когда у меня есть, скажем, 10 элементов примерно одинаковой высоты в виде списка и 7 изони помещаются на первой странице, затем, когда я нажимаю кнопку PgDown, пользователь ожидает, что элемент 8 будет в верхней части экрана (на следующей странице), но поскольку в нем всего 10 элементов, ListView прокручивается до нижней части списка, и посколькуу меня нет лишнего пространства для прокруткиКаково лучшее решение в этой ситуации?Должен ли я добавить один элемент в конец списка, который сделает последнюю страницу высотой экрана, или есть варианты получше?

Вот мой код:

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 Ответ

0 голосов
/ 05 июля 2018

Я закончил с использованием нижнего колонтитула 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...