如何使用CursorLoader实现类似whatsApp,Messenger聊天页面(反向滚动以加载更多内容)的分页?

Zia*_*Zia 6 pagination android listview android-contentprovider android-cursorloader

我的ChatActivity的OnCreateLoader和onLoadFinished是:

@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 Code Online (Sandbox Code Playgroud)

此代码对于整个chatList都适用。但是我需要第一次加载ex:20个项目,并且在顶部的每个反向滚动上都加载另外20个项目,就像WhatsApp一样显示在列表中。

是否可以使用如下所示的rawquery来实现此目的?使用以下方法,我得到了预期的数据,但是无法返回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
}
Run Code Online (Sandbox Code Playgroud)

onScroll到LoadMore机制的代码如下:

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();
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)