Java 如何将长JSON响应划分为模块,以便根据屏幕可见情况显示在ListView或RecyclerView中?

Java 如何将长JSON响应划分为模块,以便根据屏幕可见情况显示在ListView或RecyclerView中?,java,php,android,json,database,Java,Php,Android,Json,Database,我想用一个例子来说明我想要的东西,而不是从零到全部进行描述 让我们以Playstore为例,当我们搜索任何应用程序时,都会得到一长串搜索结果。只有那些结果是先下载的,我们可以看到首先取决于屏幕大小不是所有的结果一次下载。如何在我的应用程序中实现这种请求-响应循环 我使用PHP作为后端,以JSON格式获取结果。那么,如何以模块化的形式获得JSON响应。在后端使用分页的概念,发送响应,并在RecyclerView上使用延迟加载的概念 这里我添加了在recyclerview中设置延迟加载的代码 mRe

我想用一个例子来说明我想要的东西,而不是从零到全部进行描述

让我们以
Playstore
为例,当我们搜索任何应用程序时,都会得到一长串搜索结果。只有那些结果是先下载的,我们可以看到首先取决于屏幕大小不是所有的结果一次下载。如何在我的应用程序中实现这种请求-响应循环


我使用PHP作为后端,以
JSON
格式获取结果。那么,如何以模块化的形式获得
JSON
响应。

在后端使用分页的概念,发送响应,并在RecyclerView上使用延迟加载的概念

这里我添加了在recyclerview中设置延迟加载的代码

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            if (mLayoutManager.findLastCompletelyVisibleItemPosition() ==
                    mObjectList.size() - 1 && !mIsLoading && !mIsEnded) {
                mIsLoading = true;
                getList();
            }
        }
    });


private void getList() {
    addProgressItem();
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
            mUrl, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            mRefreshLayout.setRefreshing(false);
            removeProgressItem();
            setLoading(); // isLoading = false
            handleListResponse(response);
            isEmptyList();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            mRefreshLayout.setRefreshing(false);
            removeProgressItem();
            setLoading();
            VolleyErrorHandler.handle(MainActivity.this, error);
            isEmptyList();
        }
    });

    AppController.getInstance().addToRequestQueue(jsonObjectRequest, "list");
}

private void handleListResponse(JSONObject response) {
    clearList();

    try {
        mCount = response.getInt("count");
        mNextUrl = response.getString("next_url");

        //process JSON here

        mAdapter.notifyDataSetChanged();

        if (mNextUrl == null || TextUtils.isEmpty(mNextUrl) || mNextUrl.equals("null")) {
            isEnded();//set list ended
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

private void addProgressItem() {
    if (mCount != 0) {
        mObjectList.add(null);
        mAdapter.notifyItemInserted(mObjectList.size() - 1);
    }
}

private void removeProgressItem() {
    if (mCount != 0) {
        mObjectList.remove(mObjectList.size() - 1);
        mAdapter.notifyItemRemoved(mObjectList.size());
    }
}

private void setLoading() {
    mIsLoading = false;
}

private void isEnded() {
    mIsEnded = true;
}

private void isEmptyList() {
    if (mObjectList.size() == 1) {
        mObjectList.add(1, -1);
        mAdapter.notifyItemInserted(1);
    } else if (mObjectList.get(1) instanceof Integer) {
        mObjectList.remove(1);
        mAdapter.notifyItemRemoved(1);
    }
}
mRecyclerView.addOnScrollListener(新的RecyclerView.OnScrollListener(){
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
if(mLayoutManager.findLastCompletelyVisibleItemPosition())==
mObjectList.size()-1&&!加载错误&&!未加载){
加载错误=正确;
getList();
}
}
});
私有void getList(){
addProgressItem();
JsonObjectRequest JsonObjectRequest=新的JsonObjectRequest(Request.Method.GET,
mUrl,null,new Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
mRefreshLayout.setRefreshing(false);
removeProgressItem();
setLoading();//isLoading=false
handleListResponse(应答);
isEmptyList();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
mRefreshLayout.setRefreshing(false);
removeProgressItem();
设置加载();
VolleyErrorHandler.handle(MainActivity.this,错误);
isEmptyList();
}
});
AppController.getInstance().addToRequestQueue(JSONObject请求,“列表”);
}
私有void handleListResponse(JSONObject响应){
clearList();
试一试{
mCount=response.getInt(“count”);
mNextUrl=response.getString(“下一个url”);
//在这里处理JSON
mAdapter.notifyDataSetChanged();
如果(mNextUrl==null | | TextUtils.isEmpty(mNextUrl)| | mNextUrl.equals(“null”)){
isEnded();//集合列表结束
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
私有void addProgressItem(){
如果(mCount!=0){
mObjectList.add(空);
mAdapter.notifyItemInserted(mObjectList.size()-1);
}
}
私有void removeProgressItem(){
如果(mCount!=0){
mObjectList.remove(mObjectList.size()-1);
notifyItemRemoved(mObjectList.size());
}
}
私有void setLoading(){
错误加载=错误;
}
私密的{
错误=正确;
}
私有void isEmptyList(){
if(mObjectList.size()==1){
mObjectList.add(1,-1);
插入的mAdapter.notifyitems(1);
}else if(mObjectList.get(1)instanceof Integer){
mObjectList.remove(1);
删除了mAdapter.notifyItem(1);
}
}

在后端使用分页的概念,发送响应,并在RecyclerView上使用延迟加载的概念

这里我添加了在recyclerview中设置延迟加载的代码

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            if (mLayoutManager.findLastCompletelyVisibleItemPosition() ==
                    mObjectList.size() - 1 && !mIsLoading && !mIsEnded) {
                mIsLoading = true;
                getList();
            }
        }
    });


private void getList() {
    addProgressItem();
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET,
            mUrl, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            mRefreshLayout.setRefreshing(false);
            removeProgressItem();
            setLoading(); // isLoading = false
            handleListResponse(response);
            isEmptyList();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            mRefreshLayout.setRefreshing(false);
            removeProgressItem();
            setLoading();
            VolleyErrorHandler.handle(MainActivity.this, error);
            isEmptyList();
        }
    });

    AppController.getInstance().addToRequestQueue(jsonObjectRequest, "list");
}

private void handleListResponse(JSONObject response) {
    clearList();

    try {
        mCount = response.getInt("count");
        mNextUrl = response.getString("next_url");

        //process JSON here

        mAdapter.notifyDataSetChanged();

        if (mNextUrl == null || TextUtils.isEmpty(mNextUrl) || mNextUrl.equals("null")) {
            isEnded();//set list ended
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

private void addProgressItem() {
    if (mCount != 0) {
        mObjectList.add(null);
        mAdapter.notifyItemInserted(mObjectList.size() - 1);
    }
}

private void removeProgressItem() {
    if (mCount != 0) {
        mObjectList.remove(mObjectList.size() - 1);
        mAdapter.notifyItemRemoved(mObjectList.size());
    }
}

private void setLoading() {
    mIsLoading = false;
}

private void isEnded() {
    mIsEnded = true;
}

private void isEmptyList() {
    if (mObjectList.size() == 1) {
        mObjectList.add(1, -1);
        mAdapter.notifyItemInserted(1);
    } else if (mObjectList.get(1) instanceof Integer) {
        mObjectList.remove(1);
        mAdapter.notifyItemRemoved(1);
    }
}
mRecyclerView.addOnScrollListener(新的RecyclerView.OnScrollListener(){
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
super.onScrolled(recyclerView、dx、dy);
if(mLayoutManager.findLastCompletelyVisibleItemPosition())==
mObjectList.size()-1&&!加载错误&&!未加载){
加载错误=正确;
getList();
}
}
});
私有void getList(){
addProgressItem();
JsonObjectRequest JsonObjectRequest=新的JsonObjectRequest(Request.Method.GET,
mUrl,null,new Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
mRefreshLayout.setRefreshing(false);
removeProgressItem();
setLoading();//isLoading=false
handleListResponse(应答);
isEmptyList();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
mRefreshLayout.setRefreshing(false);
removeProgressItem();
设置加载();
VolleyErrorHandler.handle(MainActivity.this,错误);
isEmptyList();
}
});
AppController.getInstance().addToRequestQueue(JSONObject请求,“列表”);
}
私有void handleListResponse(JSONObject响应){
clearList();
试一试{
mCount=response.getInt(“count”);
mNextUrl=response.getString(“下一个url”);
//在这里处理JSON
mAdapter.notifyDataSetChanged();
如果(mNextUrl==null | | TextUtils.isEmpty(mNextUrl)| | mNextUrl.equals(“null”)){
isEnded();//集合列表结束
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
私有void addProgressItem(){
如果(mCount!=0){
mObjectList.add(空);
mAdapter.notifyItemInserted(mObjectList.size()-1);
}
}
私有void removeProgressItem(){
如果(mCount!=0){
mObjectList.remove(mObjectList.size()-1);
notifyItemRemoved(mObjectList.size());
}
}
私有void setLoading(){
错误加载=错误;
}
私密的{
错误=正确;
}
私有void isEmptyList(){
if(mObjectList.size()==1){
mObjectList.add(1,-1);
插入的mAdapter.notifyitems(1);
}else if(mObjectList.get(1)ins