2016-03-12 22 views
7

Tôi có khoảng 32 hồ sơ trong json, Tôi đang sử dụng RecyclerView cho họ và tôi đã thực hiện OnScrollListener (...)RecyclerView OnScrollListener() Issue

Câu hỏi

tôi bắt đầu một hoạt động, tôi lấy tất cả 32 hồ sơ, bây giờ khi tôi di chuyển, tại sao tôi lại nhận được cùng 32 hồ sơ một lần nữa và một lần nữa, bất cứ khi nào tôi di chuyển, đây là thực hiện của tôi OnScrollListener()

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

       int visibleItemCount = recyclerView.getLayoutManager().getChildCount(); 
       int totalItemCount = recyclerView.getLayoutManager().getItemCount(); 
       int pastVisiblesItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); 

       if (!isLoading) { 
        if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { 
         isLoading = true; 
         mPostPresenter.loadPosts(false); 
        } 
       } 
      } 
     }); 
    } 
+0

không mPostPresenter.loadPosts (false) làm gì? hiện nó tải json một lần nữa? –

+0

@RageshRamesh kiểm tra ngay bây giờ tôi đã đăng thêm mã – Oreo

+0

Tôi đã thêm câu trả lời có một cái nhìn và xem liệu nó có giải quyết được vấn đề của bạn hay không. nếu nó không cho tôi biết và tôi sẽ điều tra thêm. –

Trả lời

5

Việc thực hiện có vẻ là đúng nhưng đối với một điều kiện nó không thành công, hãy thử khi dy> 0 như thế này (cũng p ut này trong OnCreate của hoạt động):

private boolean loading = true; 

recyclerView.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) 
     { 

      if (loading) { 
       if (dy > 0) //check for scroll down 
       { 
        visibleItemCount = layoutManager.getChildCount(); 
        totalItemCount = layoutManager.getItemCount(); 
        pastVisiblesItems = layoutManager.findFirstVisibleItemPosition(); 

        if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { 
         loading = false; 

         Log.v("...", " Reached Last Item"); 
         loadMoreVideos(searchVideos); 
        } 

       } 
      } 
     } 
    }); 
+0

cảm ơn bạn :) giải pháp của bạn đã làm việc cho tôi, nhưng tôi không hiểu dy và dx là gì? – Oreo

+1

dx - Số lượng cuộn ngang. dy - Số lượng cuộn dọc. –

+0

@VeereshCharantimath - Xin chào. Tôi cần điều tương tự cho chế độ xem ngang. Bạn muốn gọi dịch vụ web trên mục cuối cùng hiển thị. Nhưng tôi không thể làm điều đó. Bạn có thể hướng dẫn tôi được không. –

0

Bạn đang sử dụng này

if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

Có nghĩa là một khi bạn đã xem hồ sơ 22 bạn đang tải một lần nữa. Và trong khi tải lại, bạn đang nhận được cùng một dữ liệu và thêm nó vào danh sách của bạn.

Tôi có thể thấy rằng bạn đang sử dụng RXjava. Khi bạn đăng ký trong loadPost, hãy kiểm tra dữ liệu nào bạn có thể quan sát được. tôi nghĩ rằng nó phát ra cùng một dữ liệu một lần nữa, tức là 32 bản ghi của bạn và những bản ghi đó được thêm vào một lần nữa và đây là một vòng lặp vô tận.

+0

để tôi phải thay đổi mã của mình ở đâu? – Oreo

+0

Nếu bạn không sử dụng pagenation bạn chỉ có thể loại bỏ khối listener list onscroll. Nếu bạn đang sử dụng pagenation thì vấn đề của bạn là với khối mApi.getPosts() của bạn. Nếu máy chủ của bạn đã sử dụng pagenation thì bạn sẽ phải gửi một số trang trong yêu cầu của bạn. –

+0

xóa Trình nghe trên máy tính ngay bây giờ. Khi phân trang được triển khai, bạn có thể quay lại điều này. –

0

Dưới đây là một cách khác để kích hoạt một cái gì đó khi mục cuối cùng là đạt

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

    //When last item is reached 
    if(position == yourList.size() - 1){ 
     loadMoreMessages(); 
    } 
    } 

public abstract void loadMoreMessages();