【问题标题】:RecycleView pagination not adding new item at the end?RecycleView 分页最后没有添加新项目?
【发布时间】:2018-01-07 01:36:16
【问题描述】:

我通过 Web 服务从服务器获取数据并显示在回收视图中。每个请求我都从服务器获取 5 项。我调试我的代码并检查当我滚动到recycleview 的末尾时,新数据是从服务器获取的,但它没有添加到recycleview 的末尾。我该如何解决?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timeline);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        listView = (RecyclerView) findViewById(R.id.listview);
        listView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this);
        listView.setLayoutManager(layoutManager);

        //Adding an scroll change listener to recyclerview
        listView.setOnScrollChangeListener(this);

        // Progress dialog
        pDialog = new ProgressDialog(this);
        pDialog.setCancelable(false);

        cd = new ConnectionDetector(this);
        isInternetPresent = cd.isConnectingToInternet();

        db = new SQLiteHandler(this);

        // session manager
        session = new SessionManager(this);

        /*pref = getApplicationContext().getSharedPreferences("MayahudiPref", 0);
        editor = pref.edit();*/

        // Fetching user details from sqlite
        HashMap<String, String> user = db.getUserDetails();
        id = user.get("id");
        token = user.get("token");


        getData();



        adapter = new TimeLineListAdapter(timeLineItems, this);
        listView.setAdapter(adapter);
    }

    public void getTimeLineData(final String token, final String page) {

        timeLineItems = new ArrayList<>();

            String tag_string_req = "req_register";
            // making fresh volley request and getting json
            StringRequest strReq = new StringRequest(Request.Method.POST, AppConfig.timeline, new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    VolleyLog.d(TAG, "Response: " + response.toString());
                    if (response != null) {
                        try {
                            JSONObject jObj = new JSONObject(response);
                            boolean error = jObj.getBoolean("status");
                            String message = jObj.getString("message");
                            if(error){
                                totalPages = jObj.getInt("totalPages");
                                pageCount = jObj.getInt("page");

                                int limit = jObj.getInt("limit");
                                parseJsonFeed(response);
                            }

                        }catch (Exception e){

                        }

                    }
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                }
            }) {

                @Override
                protected Map<String, String> getParams() {
                    // Posting params to register url
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("my_token", token);
                    params.put("page", page);
                    params.put("limit", "5");

                    return params;
                }
            };

            // Adding request to request queue
            AppController.getInstance().addToRequestQueue(strReq, tag_string_req);

    }

    private void parseJsonFeed(String response) {
        try {
            JSONObject jsonObj = new JSONObject(response);
            JSONArray feedArray = jsonObj.getJSONArray("data");

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

                TimeLineItem item = new TimeLineItem();
                item.setId(feedObj.getInt("id"));
                item.setName(feedObj.getString("name"));
                item.setLname(feedObj.getString("lname"));

                // Image might be null sometimes
                String image = feedObj.isNull("image") ? null : feedObj
                        .getString("image");
                item.setImge(image);
                item.setStatus(feedObj.getString("story_text"));
                item.setProfilePic(feedObj.getString("profile_pic"));
                item.setTimeStamp(feedObj.getString("time_stamp"));
                item.setIsLike(feedObj.getInt("is_like"));
                item.setTotalLikes(feedObj.getString("total_likes"));
                item.setTotalComment(feedObj.getString("total_comments"));

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

                timeLineItems.add(item);
            }

            // notify data changes to list adapater
            adapter.notifyDataSetChanged();


        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    //This method will get data from the web API
    private void getData() {
        //Adding the method to the queue by calling the method getDataFromServer
        getTimeLineData(token , String.valueOf(requestCount));
        //Incrementing the request counter
        requestCount++;
    }

    //This method would check that the recyclerview scroll has reached the bottom or not
    private boolean isLastItemDisplaying(RecyclerView recyclerView) {
        if (recyclerView.getAdapter().getItemCount() != 0) {
            int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
            if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)

                return true;
        }
        return false;
    }

    @Override
    public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        //Ifscrolled at last then
        if (isLastItemDisplaying(listView)) {
            //Calling the method getdata again
            getData();
        }
    }

【问题讨论】:

  • 像这样使用:if (page==0){ timeLineItems = new ArrayList(); }

标签: java android pagination adapter


【解决方案1】:

我认为您每次拨打getTimeLineData() 时都会创建一个新项目列表:

timeLineItems = new ArrayList<>();

首先检查你是否已经有一个列表:

if (timeLineItems == null) {
    timeLineItems = new ArrayList<>();
}

【讨论】:

  • 谢谢mrsegev。解决了我的问题。
  • 没问题!不要忘记投票,接受答案:)
【解决方案2】:
RecylerView article_list;


article_list.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            visibleitemcount = linearLayoutManager.getChildCount();
            total_itemcount = linearLayoutManager.getItemCount();
            pastVisiblecount = linearLayoutManager.findFirstVisibleItemPosition();
            Log.d(TAG, "Total : " + total_itemcount + "Visible : " + visibleitemcount + "Past : " + pastVisiblecount);
            if (loading) {
                if (visibleitemcount + pastVisiblecount >= total_itemcount) {
                    loading = false;
                    getHealthyLivingfromUrl(5, 0);
                }
            }
        }
    });


private void getHealthyLivingfromUrl(int limit, int offset) {

            //get the data code
       article_list.setAdapter(articleAdapter);
                        if (total_itemcount!=0 && total_itemcount > visibleitemcount) {
                            linearLayoutManager.setSmoothScrollbarEnabled(true);
                            linearLayoutManager.scrollToPosition(total_itemcount-visibleitemcount);
                        }
                        loading = true;

}

【讨论】:

    【解决方案3】:

    为什么要使用 POST 方法获取数据?每次获取数据时,您都在创建新数组,onCreate 将分配给适配器一个数组。然后你创建一个,但没有分配。我认为您应该在适配器类中创建 addItems(List items) 方法,并且每次获取数据时都使用此方法(在此方法中您可以通知数据已更改)。就这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多