【问题标题】:Load more JSON data into listview on scrolling, using Volley library使用 Volley 库在滚动时将更多 JSON 数据加载到列表视图中
【发布时间】:2015-09-24 18:24:44
【问题描述】:

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

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

    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 响应,然后构造新对象以附加到适配器。请帮忙。

【问题讨论】:

    标签: android json listview android-volley


    【解决方案1】:

    我建议你一个不同的解决方案:

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

    ..

       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 时,您可以更新远程检索它的列表视图内容。 希望它可以帮助你。如果您想了解更多信息,我写了post about it。 看看吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2019-12-25
      • 1970-01-01
      • 2013-04-30
      • 2021-08-29
      相关资源
      最近更新 更多