使用Volley库在滚动时将更多JSON数据加载到listview中

时间:2015-09-24 18:24:45

标签: android json listview android-volley

我尝试实现下面教程中给出的代码来创建无穷无尽的列表。 https://github.com/codepath/android_guides/wiki/Endless-Scrolling-with-AdapterViews

但我不确定如何实现本教程中提到的customLoadMoreDataFromApi(int page)方法。我的JSON请求和解析方法如下。我需要帮助添加参数' page'到请求并将新的数据集附加到列表中。

    Cache cache = AppController.getInstance().getRequestQueue().getCache();
    Entry entry = cache.get(URL_FEED);
    if (entry != null) {
        // fetch the data from cache
        try {
            String data = new String(entry.data, "UTF-8");
            try {
                parseJsonFeed(new JSONObject(data));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }



    } else {
        // making fresh volley request and getting json
        JsonObjectRequest jsonReq = new JsonObjectRequest(Method.GET,
                URL_FEED, null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                VolleyLog.d(TAG, "InitialResponse: " + response.toString());
                if (response != null) {
                    parseJsonFeed(response);
                }
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
            }
        });
        // Adding request to volley request queue
        AppController.getInstance().addToRequestQueue(jsonReq);
    }

    private void parseJsonFeed(JSONObject response) {
    try {
        JSONArray feedArray = response.getJSONArray("feed");

        for (int i = 0; i < feedArray.length(); i++) {
            JSONObject feedObj = (JSONObject) feedArray.get(i);

            FeedItem item = new FeedItem();
            item.setId(feedObj.getInt("id"));
            item.setName(feedObj.getString("name"));

            // Image might be null sometimes
            String image = feedObj.isNull("image") ? null : feedObj
                    .getString("image");
            item.setImge(image);
            item.setStatus(feedObj.getString("status"));
            item.setProfilePic(feedObj.getString("profilePic"));
            item.setTimeStamp(feedObj.getString("timeStamp"));

            // url might be null sometimes
            String feedUrl = feedObj.isNull("url") ? null : feedObj
                    .getString("url");
            item.setUrl(feedUrl);

            feedItems.add(item);
        }


        // notify data changes to list adapater
        listAdapter.notifyDataSetChanged();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

我不了解如何使用偏移值并将其作为参数添加到API请求中以检索分页数据并反序列化API响应,然后构造新对象以附加到适配器。 Pl帮助。

1 个答案:

答案 0 :(得分:0)

我建议您使用不同的解决方案:

  1. 创建扩展ListView的自定义组件
  2. 自定义适配器
  3. 自定义侦听器
  4. ...

       public class EndlessListView extends ListView implements OnScrollListener {
    
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
    
            }
    
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}
    }
    

    ...

    现在你必须覆盖onScroll来实现逻辑:

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
    
        if (getAdapter() == null)
            return ;
    
        if (getAdapter().getCount() == 0)
            return ;
    
        int l = visibleItemCount + firstVisibleItem;
        if (l >= totalItemCount && !isLoading) {
            // It is time to add new data. We call the listener
            this.addFooterView(footer);
            isLoading = true;
            listener.loadData();
        }
    }
    

    其中侦听器定义为:

    public static interface EndlessListener {
        public void loadData() ;
    }
    

    现在,当触发even并在此方法中调用loadData时,您将更新远程检索它的listview内容。 希望它能帮到你。如果您想了解更多信息,我写了post about it。 看看。