How to implement pagination like WhatsApp, chat chat page (back scrolling to load more) with CursorLoader?

My OnCreateLoader and onLoadFinished of ChatActivity:

@Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {

        CursorLoader loader = new CursorLoader(this,
                DataProvider.CONTENT_URI_MESSAGES,
                new String[]{
                    DataProvider.KEY_ID,
                    DataProvider.KEY_PHONE_NUMBER,
                    DataProvider.KEY_USER,
                    DataProvider.KEY_FLAG,
                    DataProvider.KEY_DATE_TIME,
                    DataProvider.KEY_CONTENT
                },
                "phone_number=?", new String[]{phoneNo_other}, null);
        return loader;

    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        mChatListBuilderAdapter.swapCursor(data);
    }
      

Run codeHide result


This code works well for the whole chatList. But I need to download ex: 20 items for the first time and on each backward scroll to the top have downloaded 20 more items which will appear in the list just like WhatsApp.

Can it be implemented with rawquery like below? Using the method below I got the expected data but cannot return data like Loader<Cursor>

,

public Loader<Cursor> loadInitialItems(String phone_number, int limit){  //// limit 100, 200` -- get 200 records beginning with row 101 //
    SQLiteDatabase db = this.getWritableDatabase();
    String queryToGetInitialData ="SELECT * FROM (SELECT * FROM "+MYDATABASE_TABLE+" WHERE "+KEY_PHONE_NUMBER+" = ? ORDER BY "+KEY_ID+" DESC LIMIT "+limit+") ORDER BY "+KEY_ID+" ASC";

    Cursor cursor = db.rawQuery(queryToGetInitialData, new String[] { phone_number });

    String chatContent = "";
    if (cursor.moveToFirst()) {
        do {
            chatContent = cursor.getString(cursor.getColumnIndex(DataProvider.KEY_CONTENT));
            Log.d(TAG,"chatContent from DB::"+chatContent);

        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();

    return (Loader<Cursor>) cursor; //Problem is here, this return is inappropriate
}

      

onScroll for the LoadMore engine code:

messagesList.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

        if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0) {
            if(!flag_loading) {
                flag_loading = true;
                loadNextChatItems();
            }
        }
    }
});

      

+3


source to share





All Articles