גלילה אינסופית בListView

כיום כמעט בכל אפליקציה מודרנית המציגה feed של תוכן קיימת גלילה אינסופית. מה הכוונה? במקום שהמשתמש כל פעם יגיע לסוף העמוד ויצטרך ללחוץ על כפתור טעינה, האפליקציה בעצמה תדע שהמשתמש מתקרב לסוף העמוד ותתחיל לטעון לבד את התוכן של העמוד הבא ותציג אותו אוטומטית. השאלה הגדולה היא, איך אנחנו מטמיעים את זה באפליקציה שלנו?

למען האמת, לבצע דבר כזה זה נורא פשוט. כל שעלינו לעשות הוא ליצור listener שיפעל על הListView שלנו ויזהה את מיקום המשתמש, וכאשר הlistener יזהה שהמשתמש מתקרב לסוף הדף, שיקרא לפעולה שתטען מידע נוסף.

public class EndlessScrollListener implements OnScrollListener {

    private int visibleThreshold = 5;
    private int currentPage = 0;
    private int previousTotal = 0;
    private boolean loading = true;

    public EndlessScrollListener() {
    }
    public EndlessScrollListener(int visibleThreshold) {
        this.visibleThreshold = visibleThreshold;
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
                currentPage++;
            }
        }
        if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
            // I load the next page of gigs using a background task,
            // but you can call any function here.
            new LoadGigsTask().execute(currentPage + 1);
            loading = true;
        }
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }
}

הקוד הנ"ל זה הlistener שלנו. וכדי להטמיע אותו בListView הרלוונטי נשתמש בשורת קוד הבאה:

MyListView.setOnScrollListener(new EndlessScrollListener());

אז מה בעצם עשינו פה? הפונקציה onScroll מתבצעת בכל רגע ורגע שהמשתמש גולל את הרשימה, ומעבירה לנו את מיקום המשתמש ברשימה.. תחילה נבדוק אם מתבצעת כרגע טעינה של נתונים:

  • במידה וכן - אז נבדוק אם הטעינה הסתיימה ע"י בדיקה האם התווספו נתונים חדשים לרשימה. ואם הטעינה הסתיימה אז נשנה את הflag שלנו לfalse.
  • במידה ולא – אם אין טעינה ברקע אז אנחנו רוצים לבדוק אם המשתמש מתקרב לסוף הרשימה, את זה נבדוק בעזרת השוואת מיקום המשתמש ביחס לכמות הפרמטרים ברשימה. ואם המשתמש מתקרב לסוף אז קודם כל נשנה את הflag לtrue כדי שנדע שהתחלנו לבצע טעינת נתונים, ובנוסף נטען נתונים נוספים לרשימה.

שימו לב! אם פעולת שליפת הנתונים שלכם לוקחת זמן רב (בין אם זו בקשת HTTP או שליפה מורכבת מבסיס נתונים) חשוב שזה יקרה בתהליך נפרד, אחרת האפליקציה תתקע עד שזה יסתיים, וזה לא דבר שאנחנו רוצים שיקרה.

מקור: Endless Scrolling ListView

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים

תגי HTML מותרים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>