android recyclerview json加载更多项目

时间:2015-11-10 15:28:23

标签: java android json android-recyclerview

我有这个问题,我需要从json中的数据库加载25个以上的项目。当我加载所有包含图像等应用程序需要很长时间才能加载所有这些图像。所以我想我可以加载前五个,当我滚动到底部的第二个五,依此类推。但它不起作用。这是我的代码:

Scroll listener:

rec.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            visible = lin.getChildCount();
            total = lin.getItemCount();
            past = lin.findFirstVisibleItemPosition();

            if ((visible + past) >= total){
                new HttpAsyncTask().loadMore();
            }
        }
    });

的AsyncTask:

private class HttpAsyncTask extends AsyncTask<String, Void, List<PostsData>> {
    int next;
    @Override
    protected List<PostsData> doInBackground(String... params) {
        try {
            //get json from url
            JSONObject object = new JSONObject("{'posts':"+GET("http://www.website.com/json")+"}");
            //get json array
            JSONArray array = object.getJSONArray("posts");
                for (int i = 0; i < 5; i++) {
                    next = i;
                    PostsData data = new PostsData();
                    //get object from array
                    JSONObject jsonObject = array.getJSONObject(i);
                    //title
                    data.setTitle(jsonObject.getString("name"));
                    //id
                    data.setId(jsonObject.getInt("id"));
                    JSONObject cat = jsonObject.getJSONObject("category");
                    //category name
                    data.setCatagorie(cat.getString("name"));
                    JSONObject img = jsonObject.getJSONObject("thumbnails");
                    //image url
                    String imgUrl = img.getString("preview_url");
                    //convert url into bitmap
                    data.setImage(getBitmap(imgUrl));

                    //get the post submitter name from array 'makers'
                    String makerFullname = "";
                    JSONArray userArray = jsonObject.getJSONArray("makers");
                    for (int j = 0; j < userArray.length(); j++) {
                        JSONObject user = userArray.getJSONObject(j);
                        //submitter full name
                        makerFullname = user.getString("full_name");
                        data.setUser(makerFullname);
                    }

                    data.setSubmitUser(jsonObject.getJSONObject("submitter").getString("full_name"));

                    //get the like count of the post
                    data.setLikeCount(jsonObject.getString("upvotes_count"));

                    list.add(data);
                }
        }catch (JSONException e){
            e.printStackTrace();
        }
        return list;
    }

    // onPostExecute displays th
    // results of the AsyncTask.
    @Override
    protected void onPostExecute(List<PostsData> result) {
        adapter = new PostsAdapter(result, getContext());
        rec.setAdapter(adapter);
    }

    public void loadMore(){
        try {
            //get json from url
            JSONObject object = new JSONObject("{'posts':" + GET("http://www.materialup.com/api/v1/posts") + "}");
            //get json array
            JSONArray array = object.getJSONArray("posts");
            if (array.length() <= next) {
                for (int i = 0; i < next + 5; i++) {
                    next = i;
                    PostsData data = new PostsData();
                    //get object from array
                    JSONObject jsonObject = array.getJSONObject(i);
                    //title
                    data.setTitle(jsonObject.getString("name"));
                    //id
                    data.setId(jsonObject.getInt("id"));
                    JSONObject cat = jsonObject.getJSONObject("category");
                    //category name
                    data.setCatagorie(cat.getString("name"));
                    JSONObject img = jsonObject.getJSONObject("thumbnails");
                    //image url
                    String imgUrl = img.getString("preview_url");
                    //convert url into bitmap
                    data.setImage(getBitmap(imgUrl));

                    //get the post submitter name from array 'makers'
                    String makerFullname = "";
                    JSONArray userArray = jsonObject.getJSONArray("makers");
                    for (int j = 0; j < userArray.length(); j++) {
                        JSONObject user = userArray.getJSONObject(j);
                        //submitter full name
                        makerFullname = user.getString("full_name");
                        data.setUser(makerFullname);
                    }

                    data.setSubmitUser(jsonObject.getJSONObject("submitter").getString("full_name"));

                    //get the like count of the post
                    data.setLikeCount(jsonObject.getString("upvotes_count"));

                    list.add(data);
                    adapter.notifyDataSetChanged();
                }
            }
            }catch(JSONException e){
                e.printStackTrace();
            }
    }.....

它只是不会在recyclerview中加载接下来的5个项目。我在google上搜索过,但我真的不明白负载是如何工作的。

提前致谢,Sven。

这是我遵循的教程:here

1 个答案:

答案 0 :(得分:0)

使下一个变量成为静态变量并使用i=next+1,i <next+6启动语句的loadMore方法,以避免再次加载相同的数据